Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Codigo visual o macro para abrir un fichero de word y combinar correspondencia

5,423 views
Skip to first unread message

javivi

unread,
Feb 29, 2008, 12:52:51 PM2/29/08
to

Este es el codigo de un boton generado con el asistente y abrir una
aplicacion, funciona bien al abrir word pero no al abrir un fichero de word
concreto.
En segundo lugar pero igual esto es mucho, se trata de un fichero de word
para combinar correspondencia se le podria decir que combine directamente en
un documento nuevo


private Sub Comando25_Click()
On Error GoTo Err_Comando25_Click

Dim stAppName As String

stAppName = "C:\carta mantenimiento bdp 2 fecha.doc"
Call Shell(stAppName, 1)

Exit_Comando25_Click:
Exit Sub

Err_Comando25_Click:
MsgBox Err.Description
Resume Exit_Comando25_Click

un saludo

javi

Freddy M. Aragón C.

unread,
Feb 29, 2008, 2:57:09 PM2/29/08
to
Es mejor hacerlo desde el Propio Word es mas fácil


¿Para que lo necesitas desde Access?

José Mª Fueyo

unread,
Mar 1, 2008, 4:07:37 AM3/1/08
to
Hola javivi
Este ejemplo lo tienes en
http://support.microsoft.com/default.aspx?scid=kb;es;302460
<pego>
Function accessWordDoc(docName)

Dim wordApp As Word.Application
Dim wordDoc As Word.Document

' Create new hidden instance of Word.
Set wordApp = CreateObject("Word.Application")

Set wordDoc = wordApp.Documents.Open(FileName:=docName)

' Display document name and count of words, and then close
' document without saving changes.
With wordDoc
accessWordDoc = "'" & .Name & "' contains " & .Words.Count & "
words."
.Close wdDoNotSaveChanges
End With

wordApp.Quit
Set wordApp = Nothing
</pego>
Respecto a la combinación, word tiene un grabador de macros. Graba una macro
mientras haces una fusión y observa el código generado.

Salu2
--
José Mª Fueyo
[MS MVP Access]

javivi

unread,
Mar 3, 2008, 6:07:51 AM3/3/08
to
Hola Jose

He Pegado la funcion tal cual esta sin cambios, he añadido la referencia
Microsoft word 11.0 object library. He intentado llamar a la funcion de dos
maneras

1.Desde una macro: ejecutar codigo y en nombre de funcion: accessWordDoc
("D:\mensajes2\cartamantenimientobdp.doc")
2.Desde un boton de comando:

Private Sub Comando45_Click()
accessWordDoc("D:\mensajes2\cartamantenimientobdp.doc")
End Sub

en estos dos casos no da error, aparece incluso un reloj de arena unos
segundos, pero no abre el fichero

... y tambien...

Private Sub Comando45_Click()
Print accessWordDoc("D:\mensajes2\cartamantenimientobdp.doc")
End Sub

en este caso da mensaje de error de que el objeto no admite este metodo.
Esto lo pongo pq la ayuda de microsoft pone que sale una ventana
Run this example by typing the following line in the Immediate window:

? accessWordDoc("c:\My Documents\createDoc.Doc")and pressing ENTER.

pd: Tengo access y word 2003

gracias y un saludo


"José Mª Fueyo" <jmf...@NOSPAMya.com> escribió en el mensaje
news:41F6850A-498C-442F...@microsoft.com...

javivi

unread,
Mar 3, 2008, 11:49:05 AM3/3/08
to
Hola,

lo del grabador de macros de word me ha dado el codigo creo que esta bien
puesto pero sigue el problema de que no hay ningun documento de word activo

Function accessWordDoc(docName)

Dim wordApp As Word.Application
Dim wordDoc As Word.Document

' Create new hidden instance of Word.
Set wordApp = CreateObject("Word.Application")

Set wordDoc = wordApp.Documents.Open(FileName:=docName)

With ActiveDocument.MailMerge
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
With .DataSource
.FirstRecord = wdDefaultFirstRecord
.LastRecord = wdDefaultLastRecord
End With
.Execute Pause:=False
End With


' Display document name and count of words, and then close
' document without saving changes.
With wordDoc
accessWordDoc = "'" & .Name & "' contains " & .Words.Count & "
words."
.Close wdDoNotSaveChanges
End With

wordApp.Quit
Set wordApp = Nothing

End Function
"javivi" <coh...@wanadoo.es> escribió en el mensaje
news:esQbQ7Rf...@TK2MSFTNGP02.phx.gbl...

javivi

unread,
Mar 3, 2008, 1:54:22 PM3/3/08
to
Hola,

Funciona y abre fichero de word bien (no he traducido un parrafo y no
entendia bien la funcion la bobada de pegar datos.); lo unico lo del segundo
paso que es combinar correspondencia utilizando el gabrador de macros de
word, al ejecutarlo en access despues de la funcion o en otra funcion nueva
me dice que el fichero esta bloqueado para su edicon por ´PC´ y me dice que
lo abre en modo lectura y no combina pero access entiende el codigo de
combinar pero el fichero de word esta bloqueado?. Creo que el fallo esta en
esta linea:With ActiveDocument.MailMerge

un saludo y perdonar por tanta respuesta-pregunta

Function accessWordDoc2()

With ActiveDocument.MailMerge
.Destination = wdSendToNewDocument
.SuppressBlankLines = True
With .DataSource
.FirstRecord = wdDefaultFirstRecord
.LastRecord = wdDefaultLastRecord
End With
.Execute Pause:=False
End With

End Function


"javivi" <coh...@wanadoo.es> escribió en el mensaje

news:%23EZx%235UfI...@TK2MSFTNGP02.phx.gbl...

Freddy M. Aragón C.

unread,
Mar 3, 2008, 3:24:21 PM3/3/08
to
Me parece que te estas complicando ya que es mas facil combinar
correspondencia desde el mismo Word; que hacer todo lo mismo desde Access

yo he hecho una automatizacion desde Access a Word pero solo para poner
dartos que tengo en un formulario de access

si das un ejemplo de que es lo que quieres de pronto te puede entender mas y
ayudar!

Suerte!

jeshu...@yahoo.es

unread,
Mar 13, 2008, 9:30:17 AM3/13/08
to
Hola a todos

Que suerte haber encontrado este tema aqui. Javivi no estas solo. Yo
tengo exactamente el mismo problema. Mi razon para intentar usar esto
es que la aplicacion final va destinada a gente que tiene todavia
menos idea que yo, que tampoco considero que tengo mucha. El objetivo
es que la gente solo maneje un entorno en access completamente
controlado y que con un click de boton el access abra el word, combine
la correspondencia con los registros que estaran en la base de datos y
que imprima los documentos resultantes. Sin que el usuario tenga que
intervenir.

Por supuesto era mejor hacerlo desde el word una vez metidos los datos
en el access, pero hay gente que ha metido la pata en el simple
proceso de combinar. Supongo que puede que a Javivi le pase algo
parecido.

Cualquier ayuda sobre como hacerlo es bienvenida. Muchisimas gracias
por vuestro tiempo y por compartir vuestros conocimientos.

javivi

unread,
Mar 17, 2008, 8:31:38 AM3/17/08
to
Hola jeshushete,

Perdona por el retraso pero vi tarde tu respuesta, te doy pistas de lo que
he hecho, pero yo tampoco soy un experto...

He creado una funcion (abre el documento de word (ojo en modo lectura) y
hace el enlaze de correspondencia con la base de datos de acces en concreto
con una tabla); en esta funcion recuerda que en visual de access tienes que
tener metido la referencia de word. A la funcion la puedes llamar desde un
boton de comando con una macro o con codigo en un formulario nuevo.

Tienes informacion en español de automatizacion:

http://support.microsoft.com/default.aspx?scid=kb;es;302460

y recuerda que word 2003 tiene un grabador de macros yo le utilize para el
(Graba el codigo y luego lo puedes utilizar en access)...

Function accessWordDoc(docName)

Dim wordApp As Word.Application
Dim wordDoc As Word.Document

' abrir word y el fichero


Set wordApp = CreateObject("Word.Application")

Set wordDoc =
wordApp.Documents.Open(FileName:="D:\mensajes2\cartamantenimientobd.doc")

With wordDoc
'combinar correspondencia, codigo que salio de utilizar el grabador
de macros de word
.MailMerge.OpenDataSource Name:="D:\mensajes2\LLAMADAS.mdb", _
ConfirmConversions:=False, ReadOnly:=False, LinkToSource:=True, _
AddToRecentFiles:=False, PasswordDocument:="", PasswordTemplate:="",
_
WritePasswordDocument:="", WritePasswordTemplate:="", Revert:=False,
_
Format:=wdOpenFormatAuto, Connection:= _
"Provider=Microsoft.Jet.OLEDB.4.0;Password="""";User ID=Admin;Data
Source=D:\mensajes2\LLAMADAS.mdb;Mode=Read;Extended Properties="""";Jet
OLEDB:System database="""";Jet OLEDB:Registry Path="""";Jet OLEDB:Database
Password="""";Jet OLEDB:Engine Type=5;Jet OLEDB:Data" _
, SQLStatement:="SELECT * FROM `contratos_mantenimineto`",
SQLStatement1 _
:="", SubType:=wdMergeSubTypeAccess
End With


End Function

un saludo y suerte


<jeshu...@yahoo.es> escribió en el mensaje
news:832d13d6-c444-40db...@i12g2000prf.googlegroups.com...

jeshu...@yahoo.es

unread,
Mar 26, 2008, 6:18:14 AM3/26/08
to
Hola Javivi

Muchas gracias por la respuesta. Voy a probarlo inmediatamente.

He estado consultado un poco la documentacion de microsoft y habla de
la libreria 10. Si tu has usado la 11 supongo que se puede usar la 10
o cualquier otra posterior. Yo tambien tengo acceso a la 11 en vez de
la 10.

Hay otra cuestion que puede traer problemas. Imagino que la
especificacion de usar la libreria Word 11 se queda grabada en la
propia base de datos y no depende de la configuracion del access de
cada usuario. Sabes si es asi?. Imagino que lo descubrire en cuanto
haga las primeras pruebas. Ya os comentare.

Muchas gracias de nuevo.

jeshu...@yahoo.es

unread,
Mar 26, 2008, 12:33:15 PM3/26/08
to
Hola de Nuevo!

Primeras pruebas frustradas.

Para generar la macro abro el Word, lo dejo sin ningun documento y
empiezo a grabar. Abriendo el fichero, ejecutando los pasos de
combinar correspondencia y mandandole imprimir el resultado y cerrar
el Word. Los parametros de combinar correspondencia ya estan metidos
en el fichero word que se abre.
El codigo obtenido en la macro es:

----------------------------
ChangeFileOpenDirectory "D:\Perfil Usuario\JQH1\Escritorio\"
Documents.Open FileName:="""Requerimientos avisos previos.doc""",


_
ConfirmConversions:=False, ReadOnly:=False,

AddToRecentFiles:=False, _
PasswordDocument:="", PasswordTemplate:="", Revert:=False, _
WritePasswordDocument:="", WritePasswordTemplate:="", Format:=
_
wdOpenFormatAuto, XMLTransform:=""
With ActiveDocument.MailMerge
.Destination = wdSendToPrinter


.SuppressBlankLines = True
With .DataSource
.FirstRecord = wdDefaultFirstRecord
.LastRecord = wdDefaultLastRecord
End With
.Execute Pause:=False
End With

ActiveWindow.Close
Application.Quit
----------------------------

Que se parece al tuyo pero no es del todo igual. A la hora de pasar
este codigo a la funcion hago algunos cambios, quedando el codigo
final de la funcion como sigue:

----------------------------
Public Function CombinaWord()

Dim wordApp As word.Application
Dim wordDoc As word.Document


' abrir word y el fichero
Set wordApp = CreateObject("Word.Application")

Set wordDoc = wordApp.Documents.Open(FileName:="D:\Perfil Usuario
\JQH1\Escritorio\Requerimientos avisos previos.doc")

With ActiveDocument.MailMerge
.Destination = wdSendToPrinter


.SuppressBlankLines = True
With .DataSource
.FirstRecord = wdDefaultFirstRecord
.LastRecord = wdDefaultLastRecord
End With
.Execute Pause:=False
End With

ActiveWindow.Close


wordApp.Quit
Set wordApp = Nothing

End Function
----------------------------

He quitado las primeras lineas de la macro que se supone que ejecuta
el access, creando el documento. Y he añadido las ultimas que se
supone que es como el access debe cerrar las ventanas del word y sus
propias variables. Todo esto por supuesto son suposiciones.

Cuando lo ejecuto se abre el fichero, aunque no aparece en pantalla y
da un error:

----------------------------
ERROR 5852 en ejecucion
El objeto solicitado no esta disponible
----------------------------

Y el depurador marca la linea:

----------------------------
.Destination=wdSendToPrinter
----------------------------

como fuente del error.
He probado a cambiar "ActiveDocument" por "wordDoc", pero el mensaje
de error sigue siendo el mismo.

Total que no funciona aun. Tienes idea de que puede ser o como
solucionarlo?.

Confirmar que lo he hecho con la libreria Word 11.

Muchas gracias una vez mas.

0 new messages