Access - Fusionar varios documentos word desde access vba

 
Vista:
sin imagen de perfil
Val: 11
Ha aumentado su posición en 6 puestos en Access (en relación al último mes)
Gráfica de Access

Fusionar varios documentos word desde access vba

Publicado por juan (8 intervenciones) el 15/09/2024 10:50:07
Hola,

Estoy intentando fusionar varios documentos word desde vba access y no consigo hacerlo.

Guardo en una tabla de la bd access, la ruta de los documentos que quisiera fusionar

La idea sería mediante un bucle, recorrer los documentos que recogeremos de una consulta sql en access y fusionarlos en un unico documento. Por citar un ejemplo, imaginemos varios partes de trabajo de un dia concreto que tenemos guardados en formato word dentro de una carpeta; la consulta sql recogería los partes de trabajo de ese día y tendríamos que obtener un unico documento word con todos los partes de trabajo.

¿Alguien indicarme como poder hacerlo? si hubiera algun ejemplo lo agradeceria,

saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Fusionar varios documentos word desde access vba

Publicado por Eduardo Pérez Fernández (347 intervenciones) el 17/09/2024 15:57:21
Pruebe con este código

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
Sub FusionarDocumentosWord()
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim wordApp As Object
    Dim wordDoc As Object
    Dim nuevoDoc As Object
    Dim rutaArchivo As String
 
    ' Inicializa la aplicación Word
    Set wordApp = CreateObject("Word.Application")
    wordApp.Visible = False  ' Para no mostrar la aplicación Word mientras se fusionan los documentos
 
    ' Crea un nuevo documento en blanco
    Set nuevoDoc = wordApp.Documents.Add
 
    ' Abre la base de datos actual
    Set db = CurrentDb
 
    ' Ejecuta una consulta para obtener las rutas de los documentos
    Set rs = db.OpenRecordset("SELECT RutaDocumento FROM TablaDocumentos WHERE Fecha = #2024-09-17#")
 
    ' Recorre los registros
    Do While Not rs.EOF
        rutaArchivo = rs!RutaDocumento
 
        ' Abre el documento actual
        Set wordDoc = wordApp.Documents.Open(rutaArchivo)
 
        ' Copia el contenido del documento actual al nuevo documento
        wordDoc.Content.Copy
        nuevoDoc.Content.Paste
 
        ' Cierra el documento actual sin guardar cambios
        wordDoc.Close SaveChanges:=False
 
        ' Pasa al siguiente documento
        rs.MoveNext
    Loop
 
    ' Guarda y cierra el nuevo documento
    nuevoDoc.SaveAs2 "C:\Ruta\Del\NuevoDocumento.docx"
    nuevoDoc.Close
 
    ' Cierra la aplicación Word
    wordApp.Quit
 
    ' Limpia los objetos
    Set nuevoDoc = Nothing
    Set wordDoc = Nothing
    Set wordApp = Nothing
    Set rs = Nothing
    Set db = Nothing
 
    MsgBox "Documentos fusionados con éxito."
End Sub

Consulta SQL:

Asegúrese de que la consulta SQL utilizada (SELECT RutaDocumento FROM TablaDocumentos WHERE Fecha = #2024-09-17#) devuelva las rutas correctas de los documentos Word que quiere fusionar. Ajuste la consulta según la estructura de su base de datos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 11
Ha aumentado su posición en 6 puestos en Access (en relación al último mes)
Gráfica de Access

Fusionar varios documentos word desde access vba

Publicado por juan (8 intervenciones) el 20/09/2024 01:24:18
Muchísimas gracias por tu ayuda,

El código me ha estado dando errores de automatización, pero gracias al ejemplo, he estado indagando un poco más estos días atrás y he llegado a hacer algunos arreglos hasta que he conseguido fusionar en las pruebas que he hecho tres documentos de word.

He añadido también en el código la posibilidad de identificar si Word está abierto o no de antemano, para cerrarlo y abrir los documentos que nos interesan. En si, de momento me he quedado con esta posibilidad pero también probé otra que identifica si Word lo llegamos a abrir nosotros o ya estaba de antes abierto y en función a esta opción, finalmente, lo cerramos o lo dejamos abierto.

Pongo en código de lo que digo para que quede más claro por si a alguien le interesa

-----------------------------------------------------------------------------------------------------------------------------------------
METODO 1 para abrir Word:

¿Nosotros fuimos lo que abrirmos Word o ya estaba abierto de antes?
-----------------------------------------------------------------------------------------------------------------------------------------

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Dim wordApp As Object
    Dim bWeStartedWord As Boolean
 
' METODO 1 para abrir Word
   On Error Resume Next
 
    ' Si la aplicación Word está abierta
    Set wordApp = GetObject(, "Word.Application")
 
    On Error GoTo 0
 
    ' Si no estuviera abierta la aplicación Word, la inicializamos _
    ' e indicamos que ha sido abierta por nosotros con una variable Booleana
    If wordApp Is Nothing Then
       Set wordApp = CreateObject("Word.Application")
       bWeStartedWord = True ' indicamos que nosotros abrimos la aplicación Word
    End If
   ' Hacer lo que haya que hacer en el programa...
 
   ' Para finalizar, si nosotros fuimos los que abrimos Word, lo cerramos; analizamos el valor de la variable Booleana para ello
    ' Cierra la aplicación Word
    If bWeStartedWord Then wordApp.Quit ' Para el Metodo 1

-----------------------------------------------------------------------------------------------------------------------------------------
METODO 2 para abrir Word:

Observamos si Word está abierto, lo cerramos y lo inicializamos para abrir y operar con nuestros documentos
-----------------------------------------------------------------------------------------------------------------------------------------

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Dim wordApp As Object
 
' Metodo 2 para abrir Word
 ' Cerrar MS Word si ya estaba abierto de antes
    On Error Resume Next
     Set wordApp = GetObject(, "Word.Application")
     If Not wordApp Is Nothing Then
            wordApp.Quit SaveChanges:=0
            Set wordApp = Nothing
    End If
 
    ' Abrir MS Word
    Set wordApp = CreateObject("Word.Application")
        wordApp.Visible = True ' Para mostrar (True) o no (False) la aplicación Word mientras se fusionan los documentos
 
   ' Hacer lo que haya que hacer en el programa...
 
   ' Para finalizar, cerramos la aplicación Word
    ' Cierra la aplicación Word
    wordApp.Quit ' Para el Metodo 2

-----------------------------------------------------------------------------------------------------------------------------------------

Y finalmente, pongo el código completo que he utilizado en las pruebas para fusionar como decía tres documentos
Tenemos que tener previamente tres documentos creados en la carpeta del programa; esto cada uno podría cambiarlo para adaptarse a sus documentos... en mi caso serán los documentos que recoja de una consulta SQL... pero de momento centrándonos en el ejemplo que estamos viendo...

-----------------------------------------------------------------------------------------------------------------------------------------

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
Private Sub CombinarDocumentosWord ()
 
' Declaración de variables
    Dim wordApp As Object ' Word.Application, es otra posibilidad para definir la variable pero no me funcionó de esta manera
    Dim wordDoc As Object ' Word.Document, Word.Application es otra posibilidad para definir la variable pero no me funcionó de esta manera
    Dim nuevoDoc As Object ' Word.Document, Word.Application es otra posibilidad para definir la variable pero no me funcionó de esta manera
    Dim newDocPath As String
    Dim newDocRange As Word.Range
    Dim rutaArchivo As String
    Dim i As Long
'-----------------------------------------------------------------------------------------------------------------------------------------
 
    On Error Resume Next
 
'-----------------------------------------------------------------------------------------------------------------------------------------
 
     Set wordApp = GetObject(, "Word.Application")
     If Not wordApp Is Nothing Then
            wordApp.Quit SaveChanges:=0
            Set wordApp = Nothing
    End If
 
'-----------------------------------------------------------------------------------------------------------------------------------------
    'Open MS Word
    Set wordApp = CreateObject("Word.Application")
        wordApp.Visible = True ' Para mostrar o no la aplicación Word mientras se fusionan los documentos
'-----------------------------------------------------------------------------------------------------------------------------------------
 
    ' Recorre los tres documentos con los que hemos hecho las pruebas Doc1.docx, Doc2.docx y Doc3.docx
    For i = 1 To 3
        rutaArchivo = Application.CurrentProject.Path & "\DOC" & i & ".docx" ' En la carpeta del programa tenemos que tener creados los documentos Doc1.docx, Doc2.docx y Doc3.docx - son las pruebas que he hecho
 
        ' Abre el documento actual
        Set wordDoc = wordApp.Documents.Open(rutaArchivo)
 
       ' Crea un nuevo documento en blanco, si no existía anteriormente
       If nuevoDoc Is Nothing Then Set nuevoDoc = wordApp.Documents.Add
       newDocPath = Application.CurrentProject.Path & "\Documento_Combinado.docx"
 
        ' Copia el contenido del documento actual al nuevo documento
        wordDoc.Content.Copy
 
        ' Activamos el documento nuevo para pegar el contenido del documento a copiar
        nuevoDoc.Activate
 
        ' Nos posicionamos en la parte final del nuevo documento para no borrar lo que hubiera anteriormente
        Set newDocRange = nuevoDoc.Content
        newDocRange.Collapse Direction:=wdCollapseEnd
 
        ' Insertamos un salto de sección a página siguiente; en mi caso, quería fusionar los documentos word y que estuvieran cada uno en páginas diferentes; si se omite este paso, se pegan los documentos seguidos uno detrás del otro sin separación alguna; InsertBreak tiene multiples tipos que se pueden indicar en función de lo que interese hacer (salto de página, salto de sección continua, salto de sección a página siguiente... https://learn.microsoft.com/es-es/office/vba/api/word.wdbreaktype
        Selection.InsertBreak Type:=wdSectionBreakNextPage
 
        ' Pegamos el contenido copiado en el documento nuevo
        newDocRange.Paste
 
        ' Cierra el documento actual sin guardar cambios
        wordDoc.Close SaveChanges:=False
 
    Next
 
'-----------------------------------------------------------------------------------------------------------------------------------------
 
    ' Guarda y cierra el nuevo documento
    nuevoDoc.SaveAs2 newDocPath
    nuevoDoc.Close SaveChanges:=True
 
    ' Cierra la aplicación Word
    wordApp.Quit SaveChanges:=0   'Para el Metodo 2
 
    ' Limpia los objetos
    Set nuevoDoc = Nothing
    Set wordDoc = Nothing
    Set wordApp = Nothing
 
'-----------------------------------------------------------------------------------------------------------------------------------------
 
    MsgBox "DOCUMENTOS FUSIONADOS con éxito", vbInformation, "App Message: Fusionado de documentos Word"
'-----------------------------------------------------------------------------------------------------------------------------------------
 
End Sub


Y para finalizar, lo dicho,
Gracias por la ayuda, el ejemplo...
Saludos,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar