Pregunta: | 56543 - EXPORTAR DATOS DESDE FORMULARIO ACCESS A ARCHIVOS DE WORD |
Autor: | Pablo PPM |
Hola a todos:
Estoy realizando un proyecto en el cual, a traves de un formulario de access, el usuario introduce datos en campos especificos de un documento de Word. El caso es que no puedo realizar una plantilla en word, ya que son 200 documentos especificos distintos. El primer problema es que al abrir el archivo de word, no aparece como tal, solo como proceso, por lo que la segunda vez que lo intento abrir aparece como bloqueado. Set objWord = CreateObject("Word.Application") With objWord .Options.UpdateLinksAtOpen = False .ChangeFileOpenDirectory "C:Documents and SettingsPELAPABDesktopCERTIFICADOS" For i = 0 To 139 If docs(i) = producto Then .Documents.Open FileName:=docs(i) & ".doc" End If Next i End With La siguiente cuestion es: ¿ Se puede actualizar un campo en word a partir de un formulario o una tabla de access ? Gracias de antemano. Saludos |
Respuesta: | Jose Ignacio Del Pino Sánchez |
Yo tengo un problema parecido, aunque la parte básica que es la tuya ya lo he resuelto. Echa un vistazo a mi código.
Primero abro un Documento Word en función de la ruta y nombre de Archivo que lleva el informe (plantilla), la abro en modo Lectrua y Escritura, en este documento tengo los nombres de los campos que me hace falta rellenar de la tabla Acces incluidos en las propiedades de campos añadidos (Herramientas>Formularios>Campos con texto) con la siguiente forma #nombrecampo# . Una vez que abro el documento busca esos campos y me los sustituye por los valores de los campos de la tabla Access (esto aún me falta), pues he querido hacerlo de una sóla vez y estoy intentando que el código me lea todos los nombres de los campos y me los busque en el Documento Word. Una de las referencias, en mi caso #per_ref_enc#, es la que me sirve para guardar el nombre del archivo en otra ruta distinta y con el nombre del archivo original seguido de mi referencia per_ref_enc Y por supuesto cierro el documento Word. Ahí vá el código: Option Compare Database Public db As DAO.Database Public rs As DAO.Recordset Public fld As Field Public n1, n2 As String Option Explicit Public Function AbrirDocumentoWord() '********************************************************************** 'Declarar objetos para usar Word '********************************************************************** Dim Word As New Word.Application Dim Documento As Word.Document Dim myRange As Range Dim NombreArchivo As String Dim numcam As Integer Dim nomcam As String Dim Ruta As String Dim ARCHIVO As String 'RUTA DE LA PLANTILLA WORD A ABRIR Ruta = [Forms]![fmInformesWord]![SbInformeWord]![PER_RUT_PLA] ARCHIVO = [Forms]![fmInformesWord]![SbInformeWord]![PER_INF_ARC] 'EXPEDIENTE SELECCIONADO n1 = [Forms]![fmInformesWord]![PER_REF_ENC] 'APROVECHAMOS PARA COPIAR EL EXPEDIENTE Y ASIGNARLE EL COMO APELLIDO AL NOMBRE DEL ARCHIVO n2 = [Forms]![fmInformesWord]![PER_REF_ENC] Call ApellidoDocumento '********************************************************************** 'Hace visible o no Word según se desee y abre un documento existente '********************************************************************** Word.Visible = False Set Documento = Word.Documents.Open(FileName:=Ruta & ARCHIVO, ReadOnly:=False) '********************************************************************** 'Define todo el documento '********************************************************************** Set myRange = Word.ActiveDocument.Content 'ABRIMOS CONSULTA SEGUN EXPEDIENTE Set db = CurrentDb() Set rs = db.OpenRecordset("Select * from cnperitacionword where per_ref_enc = '" & n1 & "' ") With myRange.Find .ClearFormatting .Replacement.ClearFormatting '********************************************************************** 'Busca en todo el documento el texto #Destino# para reemplazarlo por el contenido de la variable Destino '********************************************************************** numcam = rs.Fields.Count For Each fld In rs.Fields nomcam = fld.Name .Text = "#" & nomcam & "#" .Replacement.Text = rs!nomcam .Execute Replace:=wdReplaceAll numcam = numcam - 1 Next End With 'Guarda el documento en otro archivo (si no usar .Save) cierra y libera espacio en memoria '********************************************************************** Ruta = [Forms]![fmInformesWord]![SbInformeWord]![PER_RUT_DOC] ARCHIVO = [Forms]![fmInformesWord]![SbInformeWord]![PER_INF_ARC] NombreArchivo = Ruta & ARCHIVO & n2 & ".doc" Documento.SaveAs NombreArchivo 'SaveAs NombreArchivo2 Documento.Close False Set Documento = Nothing Word.Quit MsgBox "Archivo realizado", vbOKOnly, "INFORMES WORD" End Function Public Function ApellidoDocumento() Dim n, contador As Integer Dim cadena As String '******PROCEDIMIENTO PARA QUITAR LAS BARRAS DEL NOMBRE DEL EXPEDIENTE*********** 'miramos el tamaño de la cadena del expediente. Sobre todo por si tiene hijos For n = 0 To Len(n2) - 1 contador = contador + 1 Next n ' EN CASO DE SER UN EXPEDIENTE PADRE AA/0000/00 If contador = 10 Then cadena = Mid(n2, 1, 2) & Mid(n2, 4, 4) & Mid(n2, 9, 2) n2 = cadena 'EN CASO DE SER UN EXPEDIENTE HIJO AA/0000-0/00 ElseIf contador = 12 Then cadena = Mid(n2, 1, 2) & Mid(n2, 3, 6) & Mid(n2, 11, 2) n2 = cadena End If End Function |