La Web del Programador: Comunidad de Programadores
 
    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