Formulario que abre docs. De Word con registro activo

Me gustaría saber si podrías resolverme la siguiente cuestión:
Utilizo simultáneamente 14 documentos distintos para insertar en ellos los datos de los registros que voy seleccionando manualmente de una base de datos. El sistema que utilizo en los documentos es el de "combinar correspondencia" de Word. El sistema que sigo para imprimir es: una vez registrados los nuevos datos en la base de datos, abro los 14 documentos y selecciono en cada uno de ellos el registro que me interesa. A continuación imprimo ese documento, y luego repito la operación para el siguiente registro de Access, teniendo que utilizar el mismo documento para el nuevo registro o bien cualquiera de los otros 14, según me interese. Este sistema es muy engorroso, porque cuando cambio de documento tengo que recordar en qué número de registro de la base de datos me encontraba en el documento que acabo de usar, llevándome a errores y confusiones.
Querría saber si habría la posibilidad de insertar en un formulario de la base de datos enlaces (o algún sistema de control o botón) a los 14 documentos de word, de tal manera que al acabar de introducir los datos de un registro en el formulario pudiese pinchar en el enlace correspondiente al documento que me interesa para ese registro, y que al hacerlo se me abriese ese documento en el mismo registro en el que me encuentro. Y hacer así sucesivamente con cada nuevo registro que introduzca.
Otra posibilidad sería asignarle a cada registro uno de los 14 documentos que utilizo, pero teniendo en cuenta, como antes, que el documento elegido tendría que reflejar al abrirlo, los datos de ese registro concreto.
Espero haberme explicado bien, y aclaro que no tengo ni idea de Visual Basic.
{"lat":43.4875833046681,"lng":-8.21060657501221}

3 respuestas

Respuesta
4
Te comento que, al utilizar el sistema de combinar correspondencia en el Word, yo personalmente no conozco manera de abrir el Word e ir al último registro (que debería corresponderse con el último registro que has introducido). He hecho varias pruebas, pero te explico el problema:
Al abrir el Word desde Access no se ejecuta una SQL, que hace que el Word "lea" los registros de la tabla de Access. Luego el último registro no es el que acabas de meter.
He probado varias cosas en una mini aplicación que me he creado, pero en todos los casos o bien me salta un error, o bien me deja el Access colgado, o bien se abre el Word, pero en el último registro que visualicé.
No sé si habrá otro experto que sepa hacerlo, pero yo no lo puedo conseguir.
Sin embargo, hay otro sistema para hacer lo que pides. El único "inconveniente" es que, sólo contando los Words con los que trabajas (ya no cuento los campos que puedas utilizar), aplicar este sistema representaría un enorme trabajazo para ti. El sistema está basado en lo que se llaman marcadores. Para hacerlo deberías volver a crear esos 14 Words como plantillas de documento, y sobre la plantilla añadir marcadores para que fueran sustituidos por los campos de tus registros de Access.
Si te interesa que te lo explique (porque es un poco "largo") me lo comentas y, encantado, te digo cómo se hace.
Finalmente, por si puede serte de utilidad, te indico cómo puedes ir automáticamente al último registro cuando abres el Word (haciendo doble click sobre él, quiero decir).
1.- Abres el Word. Pulsas ALT+F11. Se te abrirá el VBE. Verás a la izquierda la ventana de proyecto, y ahí un icono de Word que pone "ThisDocument". Haces doble click sobre él y se te abrirá un espacio en blanco que arriba tiene dos combos".
2.- El combo que pone "General" lo despliegas y seleccionas "Document".
3.- El combo que pone "Declaraciones lo despliegas y seleccionas "Open".
4.- En las líneas que te ha creado escribes lo siguiente:
---
Private Sub Document_Open()
ActiveDocument.MailMerge.DataSource.ActiveRecord = wdLastRecord
End Sub
---
Y ya está. Ahora, cuando abras el Word, automáticamente se te abrirá el último registro.
Bueno. No sé ya qué más puedo decirte. Si quieres seguir adelante con el otro sistema que te propongo me lo comentas y, lo dicho, te explico cómo se hace.
Muchas gracias neckkito por tu respuesta. Me imagino que no será poco lo que tengas que hacer, como para pegarte el lote de probar estos trabajillos rompecocos!
Ya me suponía que la solución no sería sencilla. A pesar de que en Access soy un principiante, me imaginé que este programa no haría milagros.
No obstante, hay algo en tu respuesta que probablemente sea la solución a lo que yo ando buscando. Te comento.
Me dices que en tus pruebas se abre el word en el "último registro que visualizaste". No sé qué es lo que quieres decir con ello exactamente, pero el caso es que mi intención no es ir al último registro como tú dices, sino que el sistema de trabajo que me propongo sería el siguiente:
Primero se hace el registro total de todos los asuntos por el personal correspondiente, y una vez concluido el mismo y cerrada la base de datos, viene el momento de utilizar ese registro para confeccionar las "cartas" individualizadas aprovechando los datos ya introducidos.
Yo lo que quería exactamente (si hubiese posibilidad para ello), es utilizar un formulario para introducir nuevos datos en cada uno de los registros anteriores, y en ese mismo formulario insertar un botón, un nombre, o cualquier otro sistema para enlazar con cada una de esas 14 cartas. De tal manera que me permita imprimir el modelo que yo seleccione para cada registro, que sería, precisamente, el registro que acabo de completar y que estoy visualizando en ese momento, con lo cual, es probable que me sirvan las pruebas que tú hiciste inicialmente.
Por cierto, además de agradecerte un montón el tiempo que seguro le habrás dedicado a esto, también te agradezco lo de la fórmula para abrir los documentos en el último registro. Ya le tengo buscada alguna utilidad. Esta será la primera línea de código en VBA que escriba en mi vida!
En fin, si no se puede, no se puede, y además es imposible. Pero si se puede...
Espero no obstante alguna respuesta tuya, pero desde ya te doy un millón de gracias por tu interés.
Te voy a explicar el sistema de marcadores, porque tras leer tu respuesta estoy convencido de que esto es lo que necesitas. Te lo voy a explicar a través de un ejemplo, y tú luego lo adaptas a tu BD. Tras explicarte el sistema de marcadores te explicaré cómo adaptar la "segunda parte" de la historia a tu BD.
Antes de "matarte" a hacer todo el trabajo haz una pequeña prueba. Si te funciona correctamente ya podrás "ampliar" el proceso.
Piensa que es un proceso un tanto complicado, por lo que pueden producirse algunos errores inesperados, máxime cuando no puedo ver tu BD. Pero si te saltan errores me lo comentas e intentamos arreglarlos.
Fase 1: creamos la plantilla de word
Supongamos que quieres sacar una carta con dos campos, [Campo1] y [Campo2].
1.- Abrimos un Word y escribimos la carta. En aquellos lugares donde deba rellenarse el campo escribes el marcador (por ejemplo, mCampo1). Para ello tienes que hacer lo siguiente:
- Seleccionas mCampo1 (que la palabra entera te quede resaltada) y lo copias (CRTL+C)
- Te vas a menú Insertar->Marcador
- Donde te pide el nombre del marcador lo pegas (CTRL+V)
- Click sobre agregar
2.- Una vez tengas la carta finalizada, te vas a menú archivo->Guardar como... y lo guardas como plantilla del documento (si es Office 2007 será de extensión dotx; si es 2003 será de extensión dot).
Fase 2: operamos sobre access
3.- Abres la BD. Una vez abierta pulsas ALT+F11. Se te abrirá el editor de visual basic (VBE). Te vas a Menú->Herramientas->Referencias... y, en la pantalla que se te abre, buscas la biblioteca correspondiente a "Microsoft Word 12.0 Object Library". La marcas y aceptas. Así habrás agregado la referencia a tu BD.
3.- Ahora te vas a tu formulario de trabajo, en vista diseño, y creas un botón de comando. Sacas sus propiedades y te vas a la pestaña Otras->Nombre y ahí escribes cmdCarta.
4.- Todavía en las propiedades del botón te vas a la pestaña Eventos y buscas el evento "Al hacer click". Verás que hay un pequeño botón con puntos suspensivos. Haces click sobre él y en la pantalla que te sale le dices que quieres generar código.
5.- Se te abrirá el VBE, con dos líneas por defecto (Private Sub... y End Sub). En medio de esas líneas (no tienes que tocar nada de lo que te sale por defecto) tienes que escribir lo siguiente:
---
Private Sub...
'Guardamos el registro por si no lo hemos guardado
DoCmd. RunCommand acCmdSaveRecord
'Cogemos los valores de los campos
Dim vCampo1, vCampo2 As Variant
vCampo1 = Me.[Campo1].Value
vCampo2 = Me.[Campo2].Value
'Creamos una instancia de Word
Dim Wrd As New Word.Application
Set Wrd = CreateObject("Word.Application")
'Especificamos la ruta y nombre de archivo
Dim miArchivo As String
miArchivo="c:\Cartas\Carta1.dotx"
'Abrimos el Word y lo mostramos
Wrd.Documents.Add miArchivo
Wrd.Visible = True
'Reemplazamos los marcardores con los datos que tenemos
With Wrd.ActiveDocument.Bookmarks
.Item("mCampo1").Range.Text = vCampo1
.Item("mCampo2").Range.Text = vCampo2
End With
'Imprimimos el documento
Wrd. ActiveDocument. PrintOut
'Cerramos el documento
Wrd. ActiveDocument. Close wdDoNotSaveChanges
Wrd. Quit
End Sub
---
Y eso sería todo para esta primera fase. Evidentemente deberías sustituir los nombres de los campos por los tuyos, y establecer el valor de miArchivo con tu ruta y el nombre con extensión de la plantilla que has creado.
Si los resultados son los que esperabas ya podemos pasar a la aplicación práctica de tu BD.
Fase 3: aplicamos lo anterior a tu caso
6.- Imagina que ya has creado las plantillas, todas con su nombre. En tu BD creas una nueva tabla, llamada, por ejemplo, TWords, con un solo campo (por ejemplo, [nomWord], de tipo texto (no es necesario que sea clave principal). Rellenas esa tabla con los nombres de tus plantillas, añadiendo la extensión de archivo. Por ejemplo, un valor podría ser CartaFormal.dotx (o CartaFormal.dot si es Office 2003).
7.- En tu formulario de trabajo añades un cuadro de lista. Cuando te salga el asistente le dices que quieres coger los datos de una tabla, que será TWords, y añades el campo [nomWord]. Sigues el asistente hasta el final, configurándolo a tu gusto.
8.- Sacas las propiedades de ese cuadro de lista y te vas a la pestaña Otras->Nombre, y le pones de nombre lstWords.
9.- Creas un botón de comando, y, como antes, Propiedades->Pestaña Otras->Nombre, y le pones cmdWord
10.- Siguiendo en las propiedades del botón de comando, te vas a la pestaña Eventos y al evento "Al hacer click" le generas el siguiente código (parecido al anterior pero adaptado a las nuevas circunstancias):
---
Private Sub...
'Guardamos el registro por si no lo hemos guardado
DoCmd. RunCommand acCmdSaveRecord
'Cogemos los valores de los campos
Dim vCampo1, vCampo2 As Variant
vCampo1 = Me.[Campo1].Value
vCampo2 = Me.[Campo2].Value
'Creamos una instancia de Word
Dim Wrd As New Word.Application
Set Wrd = CreateObject("Word.Application")
'Especificamos la ruta y nombre de archivo
Dim miRuta As String
Dim miArchivo As String
miArchivo = Me.lstWord.Value
miRuta = "C:\cartas\"
miArchivo=miRuta & miArchivo
'Abrimos el Word y lo mostramos
Wrd.Documents.Add miArchivo
Wrd.Visible = True
'Reemplazamos los marcardores con los datos que tenemos
With Wrd.ActiveDocument.Bookmarks
.Item("mCampo1").Range.Text = vCampo1
.Item("mCampo2").Range.Text = vCampo2
End With
'Imprimimos el documento
Wrd. ActiveDocument. PrintOut
'Cerramos el documento
Wrd. ActiveDocument. Close wdDoNotSaveChanges
Wrd. Quit
End Sub
---
Ahora tendrás que configurar, por un lado, la variable miRuta, donde le pondrás la ruta donde tengas los Words (que doy por sentado que estarán todos en la misma carpeta, porque si no, con 14 plantillas, la cosa se complicaría mucho si no están todos en el mismo sitio), y la variable miArchivo, en principio, ya te vendrá dada por el nombre de archivo que hayas seleccionado en el cuadro de lista.
Es muy importante que vayas con mucho cuidado con los nombres, puesto que para el código cualquier variación en una letra significa un nombre diferente, y entonces te dará error de código.
El proceso de usuario sería el siguiente:
- Abres el formulario y rellenas el registro.
- Seleccionas el Word correspondiente en la lista
- Haces click sobre el botón, y automáticamente se te abrirá el Word, se rellenarán los marcadores y te imprimirá el documento.
Y eso es todo. Como ya te comentaba el proceso es un poco complicado. Si te da algún error me lo comentas e intentamos solucionarlo.
Chaval!
Eres la repanocha!
No sé si funcionará o no, pero lo que queda claro es que eres una máquina! Sólo por las molestias que te has tomado ya te mereces un diez.
Creo que entendí a la perfección tus instrucciones. La verdad es que se nota que estás acostumbrado a las explicaciones.
Lo voy a probar, pero a mí me va a llevar mucho más tiempo que a ti hacer una simple prueba. No desesperes. En cuanto tenga algún resultado para bien o para mal, o porque algo no me quedó claro, ya te lo diré. De entrada un millón de gracias.
Impresionante!
La primera prueba funciona a la perfección. El único inconveniente (por ponerle alguno) es que va un poquillo lento por tener que abrir y cerrar cada una de las plantillas sin guardar los cambios para que funcionen en los siguientes registros. Pero tampoco se le pueden pedir peras al olmo.
No te tienes ganadas las cinco estrellas, te tienes ganado el cielo!
Esta misma pregunta la colgué en el tablón y se la hice a varios expertos, y ninguno se atrevió a darme una respuesta.
De momento prefiero no finalizar esta pregunta porque me falta la última fase, aunque te advierto que me va a llevar bastante tiempo. Primero tengo que debatir con mis compañeros el formato definitivo de las 14 plantillas, después confeccionar la base de datos en casa, y por último modificar la ruta de acceso a cada una de las plantillas para adaptarlas a los ordenadores del trabajo. Todo esto seguro me va a llevar más de un mes.
Si me surgiera alguna duda o me dejase de funcionar el sistema (cosa que no creo, porque las instrucciones son bien claritas) ya te lo diría.
Un millón y pico de gracias.
De verdad me alegra haberte dado una solución a tu problema, y que encima funcione... je, je...
También te agradezco tus amables palabras. Realmente gracias a ti ;)
Por casualidad he visto una pequeña cosa en lo que te explicaba en la Tercera fase que no está bien: te explico que crees cuadro de lista llamado lstWords, y después, en el código, tienes una línea que dice:
miArchivo = Me.lstWord.Value
O bien el cuadro de lista se debe llamar lstWord (sin la ese final), o bien la línea del código debería poner:
miArchivo = Me.lstWords.Value
En definitiva, que ambos nombres deben coincidir.
Finalmente, como aprecio una cierta "inquietud" hacia el mundillo de Access por tu parte, aprovecho para hacerme un poco de propaganda y comentarte que será un placer para mí si puedes darte un paseíto por mi web, que es http:://neckkito.eu5.org, para saber qué te parece. Está hecha pensando en gente que o bien empieza o bien sabe un poco pero quiere saber un poco más.
Verás que es relativamente nueva de creación (la empecé en junio), y que poco a poco voy añadiendo cosas, pero bueno, creo que con lo que hay ahora ya te podrás hacer una idea de lo que pretendo con esa página.
Evidentemente cualquier crítica, sugerencia, idea o similares serán muy bienvenidas.
Reitero mi agradecimiento por tus palabras y quedo a tu disposición para lo que necesites.
Respuesta

Caballero, me sirvió mucho esta explicación, estoy realizando un proyecto similar y prácticamente resolviste mi duda.

Respuesta

Genial. Da gusto encontrar en la red gente ten preparada y que resuelve así de "fácil" nuestras dudas. Un 10.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas