26 febrero, 2021

COMBINAR CORRESPONDENCIA Y GUARDAR DOCUMENTOS INDEPENDIENTES

Hola a todos!

El post de hoy va a ser distinto a los que acostumbro a subir a la web, sobre todo porque está programado en WORD.

Hace ya tiempo que escribí un post relacionado con Combinar Correspondencia, en concreto para intentar dar solución a un problema muy común cuando se realiza esta funcionalidad con WORD, es decir, el obtener de manera individual todos los documentos generados.

Si no estáis familiarizados con Combinar Correspondencia, en este enlace podéis leer en profundidad de qué se trata. Si bien, en resumen, combinamos los campos de un archivo de Excel con una plantilla en WORD y generamos tantos documentos como datos tengamos en Excel. Podemos enviar por correo electrónico cada documento a su destinatario o generar los documentos todos a la vez, de uno en uno o por tramos.

Pero entonces, ¿cuál es el problema?, pues que si tenemos que generar 500 cartas (individuales), sería bastante tedioso el tener que generar y guardar cada documento de uno en uno manualmente.

Ante esta necesidad, en un primer avance lo he realizado con Excel directamente, y el proceso funciona correctamente, pero tiene sus limitaciones (fundamentalmente los formatos). Para solucionarlo me he decidido a hacerlo en Word. Me documenté con algunos procesos que se proponen en Internet, pero no me acababan de convencer, eran demasiado manuales y poco intuitivos. Así que he creado un proceso bastante más automatizado para facilitar la experiencia del usuario.

El primer paso que debemos realizar es obtener el archivo de WORD con los documentos ya generados, todos en el mismo archivo. Importante, el proceso está programado para documentos que ocupen un folio (una hoja de Word).

Pues bien, vamos a hacerlo paso a paso:

  • Generamos los documentos con Combinar correspondencia. Vamos a partir del siguiente listado en Excel (100 líneas)

COMBINAR CORRESPONDENCIA Y GUARDAR DOCUMENTOS INDEPENDIENTES

  • Combinamos correspondencia con el siguiente texto:

COMBINAR CORRESPONDENCIA Y GUARDAR DOCUMENTOS INDEPENDIENTES1

Una vez que hemos combinado y generado todos los documentos obtendremos un archivo de 100 hojas (una por empleado de la base de Excel).

A continuación, ese documento lo vamos a guardar, pero lo haremos o bien como .Doc o como .Docm (para macros), pero no .Docx. El motivo es que vamos a incluir una macro en el documento y con extensión .Docx no permite guardar con macros. Para este ejemplo lo denominaré como «DOCUMENTOS GENERADOS»

Hasta este punto ya tenemos el archivo de Word que queremos trocear en 100 archivos. Ahora debemos crear una carpeta o saber en cuál vamos a importar todos estos archivos, en mi ejemplo la crearé y la denominaré: «DESTINO».

COMBINAR CORRESPONDENCIA Y GUARDAR DOCUMENTOS INDEPENDIENTES3

Y ya tenemos todo lo necesario para abrir DOCUMENTOS GENERADOS, crear un módulo estándar y pegar nuestra macro:

Option Explicit
Sub COMBINAR()
'DECLARAMOS VARIABLES
Dim mArchivo As Variant, fdocument As Document
Dim miExcel As String, target As Variant, obSQL As String
Dim cnn As Object, dataread As Object, filas As Long
Dim i As Long, iname As Variant, midoc As Document
Dim mi_archivo As String, campo As String, miCarpeta As Variant
Dim texto As Variant, target_a As Variant
'Capturamos documento actual
Set fdocument = ThisDocument
'Abrimos ventana de diálogo para seleccionar el archivo Excel
'que hemos combinado
Set mArchivo = Application.FileDialog(msoFileDialogOpen)
If mArchivo.Show = 0 Then Exit Sub
miExcel = mArchivo.SelectedItems(1)
'Abrimos ventana de diálogo para seleccionar la carpeta en la que
'guardaremos todos los archivos independientes
Set miCarpeta = Application.FileDialog(msoFileDialogFolderPicker)
If miCarpeta.Show = 0 Then Exit Sub
miCarpeta = Application.FileDialog(msoFileDialogFolderPicker).SelectedItems(1) & "\"
'Generamos documento nuevo
Set target = Documents.Add
'Con instrucción SQL seleccionamos el nombre de la hoja
'y el campo con el que queremos identificar cada documento de word
obSQL = "SELECT [BBDD$].[NOMBRE COMPLETO] FROM [BBDD$]"
'Iniciamos conexión ADO para pasar una tabla con los items
'del campo seleccionado
Set cnn = New ADODB.Connection
With cnn
.Provider = "Microsoft.ACE.OLEDB.12.0"
.Connectionstring = "DATA SOURCE=" & miExcel
.Properties("Extended Properties") = "Excel 8.0"
.Open
End With
Set dataread = New ADODB.Recordset
With dataread
.Source = obSQL
.ActiveConnection = cnn
.CursorLocation = adUseClient
.CursorType = adOpenForwardOnly
.LockType = adLockReadOnly
.Open
End With
'Grabamos los datos en el documento Word generado (target)
dataread.MoveFirst
filas = dataread.RecordCount
Selection.InsertAfter dataread.Fields(0)
Do Until dataread.EOF
dataread.MoveNext
If dataread.EOF = "Verdadero" Then Exit Do
campo = Replace(dataread.Fields(0), "-", " ")
Selection.InsertAfter Chr(11) & campo
Loop
'Formateamos los datos grabados como una tabla
Selection.ConvertToTable Separator:=wdSeparateByDefaultListSeparator, _
numcolumns:=1, Numrows:=filas, AutoFitBehavior:=wdAutoFitFixed
Set midoc = ActiveDocument
'Recorremos la tabla
For i = 1 To midoc.Tables(1).Rows.Count
Set iname = midoc.Tables(1).Cell(i, 1).Range
'Eliminamos de cada dato el retorno de carro, Chr(13).
'Eliminamos el último caracter de la cadena de texto
mi_archivo = Mid(Replace(miCarpeta & iname.Text, Chr(13), ""), 1, Len(Replace(miCarpeta & iname.Text, Chr(13), "")) - 1)
'Recorremos todas las hojas del documento word actual
'Creamos un nuevo documento y pasamos el contenido de cada combinación.
Set texto = fdocument.Sections(i).Range
texto.End = texto.End - 1
Set target_a = Documents.Add
target_a.Range.FormattedText = texto
'Nombramos cada documento con el nombre
'de la hoja que contiene los datos extraidos de Excel
target_a.SaveAs FileName:=mi_archivo
'Cerramos cada documento
target_a.Close
Next i
'cerramos el documento con los datos de Excel
ActiveDocument.Close SaveChanges:=False
End Sub

Después de pegar la macro, debemos activar las referencias para trabajar con ADO: Microsoft ActiveX Data Object 2.8 Library (en caso de no tener esta librería podéis probar con otra de la lista).

Este paso debéis hacerlo, de lo contrario se mostrará un error y no podréis continuar.

COMBINAR CORRESPONDENCIA Y GUARDAR DOCUMENTOS INDEPENDIENTES4

Otro paso que debemos realizar manualmente es determinar el campo del archivo Excel a incluir en el documento de Word.

Debemos especificarlo en la siguiente línea de código:

obSQL = "SELECT [BBDD$].[NOMBRE COMPLETO] FROM [BBDD$]"

Donde la hoja de nuestro archivo Excel se denomina BBDD, debemos especificarlo en la sentencia SQL y siempre con el dólar al final. El campo que vamos a incluir será NOMBRE COMPLETO y también lo especificamos en el SQL. Este paso es importante, si el nombre de la hoja o del campo no es correcto, se mostrará un error y no podremos continuar. Si se muestra el error, debéis reiniciar la macro para volver a ejecutarla y eliminar el documento en blanco que se creó antes de llegar al error.

Pero sigamos, suponiendo que ya tenemos la macro totalmente preparada, cuando la ejecutemos se mostrará un cuadro de diálogo para seleccionar el archivo Excel:

COMBINAR CORRESPONDENCIA Y GUARDAR DOCUMENTOS INDEPENDIENTES6

A continuación se volverá a abrir otro cuadro de diálogo para seleccionar la carpeta en la que dejaremos todos los 100 documentos creados:

COMBINAR CORRESPONDENCIA Y GUARDAR DOCUMENTOS INDEPENDIENTES7

Después dejaremos que se vayan generando los documentos hasta que finalice la macro, el resultado será este:

COMBINAR CORRESPONDENCIA Y GUARDAR DOCUMENTOS INDEPENDIENTES5

Como podéis observar hemos generado 100 documentos y los hemos identificado con su nombre (podría ser con otro campo cualquiera que sea un identificados único).

Y eso es todo!. Espero que el post sea lo bastante claro y no os queden dudas, pero en cualquier caso, os dejaré los dos archivos para que realicéis pruebas.

Descarga el archivo de ejemplo pulsando en: DOCUMENTOS GENERADOS

Descarga el archivo de ejemplo pulsando en: BASE EXCEL PARA COMBINAR

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies

Comparte este post

177 comentario en “COMBINAR CORRESPONDENCIA Y GUARDAR DOCUMENTOS INDEPENDIENTES

  1. COMBINAR CORRESPONDENCIA me genera un ERROR Estoy seguro que se debe al paso manual: obSQL = «SELECT [BBDD$].[NOMBRE COMPLETO] FROM [BBDD$]» este paso hay que hacerlo en el Nombre del archivo en Word ? Remito archivo completo COMPRIMIDO Favor colaborarme Gracias

    1. Hola Emiro:

      No me ha llegado ningún archivo. El paso manual hace referencia al archivo EXCEL, en el post indico cómo deben incluirse los parámetros:

      BBDD es el nombre de la hoja, Nombre completo es el nombre del campo. Revisa el ejemplo del post, verás como en el segundo archivo (el Excel estos son los campos usados.

      Intenta reproducir mi ejemplo, paso por paso comprendiendo cómo funciona el código. En resumen, el SQL hace referencia al Excel no al Word.

      Saludos.

  2. Excelente solución! esto debería estar incorporado en Word! sólo para reforzar el tutorial… en la línea

    “SELECT [BBDD$].[NOMBRE COMPLETO] FROM [BBDD$]”

    BBDD es el nombre de la Hoja de Excel, no el archivo Excel! cuando uno crea un archivo excel, por defecto se crea «Hoja1»
    NOMBRE COMPLETO: Es el nombre del campo! es decir, en los títulos de la tabla hay que elegir el que necesitas para generar en base a ese los nombres de los archivos.

    Recordar también que la primera ventana que aparece es para elegir el archivo y la segunda es para elegir la carpeta.

    Yo copié y pegue y modifique. Simple.

    Felicitaciones!

  3. La función está excelente, sin embargo, es posible realizar también el copiado del encabezado? y que pasaría si esto tiene una imagen.

    1. Hola Francisco,

      Lo de la imagen no tiene ningún tipo de problema porque hacer antes el combinar correspondencia bajo el modelo que estimes oportuno, incluida la imagen.

      Lo de copiar los encabezados, francamente no veo la necesidad, en el combinar correspondencia no se admite, y aunque con ADO se puede copiar el encabezado, a la hora de trozear el archivo solo utilizas el campo que te interesa para distinguir los archivos, normalmente un nombre o un ID.

      Saludos.

  4. Me ha sido de mucha ayuda. Te agradecería que me ayudaras por que no obstante me genera un error: campo = Replace (dataread.Fields (0), «-«, » «)
    y cuando la ejecuto se abre una única hoja de word con una fila con todos los nombres de USUARIO, que es el nombre del que he elegido para el SQL.
    Por qué no genera todos los documentos?, por qué me da ese error si he copiado tu macro tal y como la tienes?.
    Muchas gracias por tu respuesta… urgente si puede ser. Te lo agradezco muchísimo. Amaia

  5. Hola de nuevo!. Ahora me da un nuevo error:
    Iniciamos conexión ADO para pasar una tabla con los items
    del campo seleccionado
    LockType = adLockReadOnly
    Open
    Me pone error en el nombre, y me subraya fosforito este último Open
    Te agradezco mucho tu ayuda.
    Un saludo

  6. ‘Iniciamos conexión ADO para pasar una tabla con los items
    ‘del campo seleccionado
    Set cnn = New ADODB.Connection
    With cnn
    .Provider = «Microsoft.ACE.OLEDB.12.0»
    .Connectionstring = «DATA SOURCE=» & miExcel
    .Properties(«Extended Properties») = «Excel 8.0»
    .Open
    End With
    Set dataread = New ADODB.Recordset
    With dataread
    .Source = obSQL
    .ActiveConnection = cnn
    .CursorLocation = adUseClient
    .CursorType = adOpenForwardOnly
    .LockType = adLockReadOnly
    .Open

    Estos son los datos que me da error. Los he copiado exactamente para facilitar la ayuda.
    Gracias de nuevo.

    1. Hola Amaia:

      Ese error aparece cuando el nombre del archivo Excel o de la pestaña de Excel no es correcto:

      obSQL = «SELECT [BBDD$].[NOMBRE COMPLETO] FROM [BBDD$]»

      En el ejemplo que he subido, la pestaña o hoja Excel con los datos se llama BBDD$ siempre tienes que poner un dolar al final para indicar que se trata de una hoja. Y el campo o nombre de columna con el dato a asociar es NOMBRE COMPLETO.

      Esto debe ser exactamente como lo tengas en tu archivo excel.

      En cuanto al otro error:

      campo = Replace(dataread.Fields(0), «-«, » «) omite el replace directamente:

      campo = dataread.Fields(0)

      Saludos.

      1. Buenas tardes,

        Me ocurre el mismo error del Replace:

        campo = Replace(dataread.Fields(0), “-“, ” “) omite el replace directamente:

        campo = dataread.Fields(0)

        Lo corregi y lo deje asi: campo = dataread.Fields(0)

        Pero me sigue generando error.

        Ya se genera un documento con los nombres de la lista, pero aun no crea los archivos por aparte.

        ¿Que podria hacer?

        1. Gracias por responder! He probado tu ejemplo y funciona perfectamente, Voy a rehacer mi hoja de datos de Excel, por si hay algo oculto que estorba… tiene que funcionar si o si! :-O

  7. Hola,
    Me gustaría pedir ayuda para saber como puedo combinar un documento de word con origen de datos en excel, donde en una misma línea del asunto tengo que combinar varios registros diferentes (filas) que corresponden a un mismo usuario, sin que me salgan tantos documentos como filas de registro son.
    Es decir, si tengo 3 filas con números de expedientes diferentes (B1, B2 y B3), donde A1, A2 y A3 es el mismo usuario , y quiero mandar una única carta cuyo asunto sea:
    Asunto: Expedientes {B1}, {B2}, {B3}
    Se puede hacer esto?, cómo puedo hacerlo?

    Luego también aplicaré la macro para que se guarden como documentos independientes….

    Muchísimas gracias por la ayuda!!!
    Amaia

    1. Hola Amaia:

      Lo que indicas no se puede hacer con combinar correspondencia, para ello sería necesario previamente pasar esos 3 registros a una única linea de datos para que la pueda leer word y combinar un documento por cliente.

      Sería necesarios analizar el archivo y verificar si es posible hacer un programa que agrupe los datos.

      Saludos

  8. Hola Segu, una pregunta, lo tengo todo montado pero al ejecutar me da error. «Se ha producido error 54941 en tiempo de ejecucion: El elemento del conjunto solicitado no existe» Le doy a depurar y me lleva a la linea Set texto = fdocument.Sections(i).Range ¿A qué se debe?

    Gracias

    1. Hola Raul:

      Es complicado poder contestarte sin ver el archivo. Pero ese error surge cuando un objeto no existe, en tu caso parece que fdocument no lo encuentra.

      No sé que versión de Excel usas, en este caso estoy con 2019, pero debería funcionar igualmente desde por lo menos 2010. Si descargas mi ejemplo te funciona??, te dá el mismo error??, si funciona es que en algún momento al crear tu proceso con tus datos, hay algún elemento que has modificado o variado.

      Si mi ejemplo no funciona, prueba en otro office para verificar que no es un problema de la versión.

      Espero haberte ayudado,.

      Saludos.

  9. Hola!

    Muchas gracias, el ejemplo me ha servido enormemente en un trabajo que vengo realizado.

    Tengo una pregunta, ¿es posible obtener el scrip para que los archivos los genere en formato pdf?

    Gracias nuevamente!

    1. Hola Jhon:

      Es posible, si añades lo siguiente en el código, obtendrás tanto los word como los PDF, uno de cada.

      'Nombramos cada documento con el nombre
      'de la hoja que contiene los datos extraidos de Excel
      target_a.ExportAsFixedFormat ExportFormat:=wdExportFormatPDF, OpenAfterExport:=False, OptimizeFor:= _
      wdExportOptimizeForPrint, Range:=wdExportAllDocument, OutputFileName:=mi_archivo
      target_a.SaveAs FileName:=mi_archivo
      'Cerramos cada documento
      target_a.Close

      1. Hola.
        Lo primero: mil gracias por la macro y el código para PDF. En este último caso, cuando ejecuto la madro, me dice que el archivo está siendo usado y cuando voy a Depurar, me indica que el error está justo en el código de PDF.
        Lo que he hecho es sustituir (no añadir) ambas partes, la de nombrar documento y cerrar cada documento, por el código que has indicado.

        ¿Cual puede ser el error?
        Gracias

        1. Hola Manyez:

          Este mismo código con el ejemplo que he publicado funciona perfectamente. Intenta descargar el ejemplo del post y ejecutarlo en tu equipo, si funciona es posible que el problema con tu información sean los datos.

          Para poder ayudarte necesito ver un ejemplo de la información del Excel que estás usando.

          Saludos.

          1. Holla!
            Lo primero: gracias por todo. Estoy usando Excel 2013. El código original funciona sin problema, pero cuando cambio para usar la opción PDF es cuando surge el problema.
            Gracias de nuevo

          2. Hola Manyez:

            He probado el código en 2013 y funciona perfectamente:

            La opción de PDF se tiene que ejecutar con la de word, es decir generas dos archivos uno en word y otro en PDF

            Te dejo la macro completa:

            Option Explicit
            Sub COMBINAR()
            'DECLARAMOS VARIABLES
            Dim mArchivo As Variant, fdocument As Document
            Dim miExcel As String, target As Variant, obSQL As String
            Dim cnn As Object, dataread As Object, filas As Long
            Dim i As Long, iname As Variant, midoc As Document
            Dim mi_archivo As String, campo As String, miCarpeta As Variant
            Dim texto As Variant, target_a As Variant
            'Capturamos documento actual
            Set fdocument = ThisDocument
            'Abrimos ventana de diálogo para seleccionar el archivo Excel
            'que hemos combinado
            Set mArchivo = Application.FileDialog(msoFileDialogOpen)
            If mArchivo.Show = 0 Then Exit Sub
            miExcel = mArchivo.SelectedItems(1)
            'Abrimos ventana de diálogo para seleccionar la carpeta en la que
            'guardaremos todos los archivos independientes
            Set miCarpeta = Application.FileDialog(msoFileDialogFolderPicker)
            If miCarpeta.Show = 0 Then Exit Sub
            miCarpeta = Application.FileDialog(msoFileDialogFolderPicker).SelectedItems(1) & "\"
            'Generamos documento nuevo
            Set target = Documents.Add
            'Con instrucción SQL seleccionamos el nombre de la hoja
            'y el campo con el que queremos identificar cada documento de word
            obSQL = "SELECT [BBDD$].[NOMBRE COMPLETO] FROM [BBDD$]"
            'Iniciamos conexión ADO para pasar una tabla con los items
            'del campo seleccionado
            Set cnn = New ADODB.Connection
            With cnn
            .Provider = "Microsoft.ACE.OLEDB.12.0"
            .Connectionstring = "DATA SOURCE=" & miExcel
            .Properties("Extended Properties") = "Excel 8.0"
            .Open
            End With
            Set dataread = New ADODB.Recordset
            With dataread
            .Source = obSQL
            .ActiveConnection = cnn
            .CursorLocation = adUseClient
            .CursorType = adOpenForwardOnly
            .LockType = adLockReadOnly
            .Open
            End With
            'Grabamos los datos en el documento Word generado (target)
            dataread.MoveFirst
            filas = dataread.RecordCount
            Selection.InsertAfter dataread.Fields(0)
            Do Until dataread.EOF
            dataread.MoveNext
            If dataread.EOF = "Verdadero" Then Exit Do
            campo = Replace(dataread.Fields(0), "-", " ")
            Selection.InsertAfter Chr(11) & campo
            Loop
            'Formateamos los datos grabados como una tabla
            Selection.ConvertToTable Separator:=wdSeparateByDefaultListSeparator, _
            numcolumns:=1, Numrows:=filas, AutoFitBehavior:=wdAutoFitFixed
            Set midoc = ActiveDocument
            'Recorremos la tabla
            For i = 1 To midoc.Tables(1).Rows.Count
            Set iname = midoc.Tables(1).Cell(i, 1).Range
            'Eliminamos de cada dato el retorno de carro, Chr(13).
            'Eliminamos el último caracter de la cadena de texto
            mi_archivo = Mid(Replace(miCarpeta & iname.Text, Chr(13), ""), 1, Len(Replace(miCarpeta & iname.Text, Chr(13), "")) - 1)
            'Recorremos todas las hojas del documento word actual
            'Creamos un nuevo documento y pasamos el contenido de cada combinación.
            Set texto = fdocument.Sections(i).Range
            texto.End = texto.End - 1
            Set target_a = Documents.Add
            target_a.Range.FormattedText = texto
            'Nombramos cada documento con el nombre
            target_a.ExportAsFixedFormat ExportFormat:=wdExportFormatPDF, OpenAfterExport:=False, OptimizeFor:= _
            wdExportOptimizeForPrint, Range:=wdExportAllDocument, OutputFileName:=mi_archivo
            target_a.SaveAs FileName:=mi_archivo
            'Cerramos cada documento
            target_a.Close
            Next i
            'cerramos el documento con los datos de Excel
            ActiveDocument.Close SaveChanges:=False
            End Sub

  10. hola
    muchissimas gracias para esa macro. He seguido tus instruciones solo que a mi me genera el error 94 uso no válido de null. Me podrias ayudar?

    1. Hola Carmen:

      Te contesto lo mismo que al lector anterior, necesitaría ver un ejemplo de los datos del Excel con que quieres combinar correspondencia para verificar si el problema está en los datos.

      SAludos.

      1. He podido solucionarlo
        ahora tengo un problema de formato. La macro funciona perfectamente pero al guardar los archivos me cambia el formato del documento word y la letra queda muy mal. Hay posibilidad de cambiar algo en la macro para ampliar el formato? O en que linea has programado el formato?
        Saludos

        1. Hola Carmen:

          El formato lo tienes que aplicar al hacer por primera vez el combinar correspondencia. La La macro lo que hace es trocear el archivo generado y guardarlo como word o pdf.

          SAludos.

          1. Pero que formato le aplico? porque tengo mi generica de la carta utilizo para combinar. Hasta ahi todo bien pero al aplicar la macro todo el formato cambia.

          2. Hola Carmen:

            Tal como te comentaba, el problema es el formato de la carta de inicio, margenes, saltos de sección, etc.

            Para poder configurar la macro para esa forma es necesario reprogramar toda la macro, no obstante lo estudiaré para futuras publicaciones.

          3. tengo la misma incquietud. en mi cuando hago combinacion de correspondencia el formato de mis cartas esta en tamaño oficio y le acomapaña pie de paginas y un logo. cuando corro la macro, me genera todas las cartas, pero en tamaño carta y sin el pie de pagina ni los logos.. que puedo hacer?

    2. Buenas Noches, Como solucionaste ese problema ya cambie lo que dice arriba pero me sigue genrando el mismo error 94

      Gracias

  11. Muy buenas y gracias por la ayuda que nos prestas,

    Tengo el mismo problema que AMAIA JAKIN, cuando ejecuto la macro se genera un único Word con una columna con el listado de nombres que he asignado y el error que me sale es «error «94» en tiempo de ejecución» Uso no válido Null. Al depurar me indica la línea:

    campo = Replace(dataread.Fields(0), “-“, ” “)

    esta línea la he sustituido por:

    campo = dataread.Fields(0)

    ejecuto y me sigue generando el mismo error.

    Agradecería me ayudases con el problema, un saludo.

  12. Todo me funciona muy bien, pero tengo un problema con los encabezados no se copian me podrías ayudar con la solución no soy muy conocedor del tema

    1. Hola Anthony, no puedes tener encabezados, la macro copia o traslada los datos del campo. Cuando haces combinar correspondencia en word no trabajas con encabezados.

      Saludos.

    1. Después de pegar la macro, debemos activar las referencias para trabajar con ADO: Microsoft ActiveX Data Object 2.8 Library (en caso de no tener esta librería podéis probar con otra de la lista).

      Este paso debéis hacerlo, de lo contrario se mostrará un error y no podréis continuar.

  13. Buenos dias, ante todo gracias por compartir sus conociemientos. Le queri aplantear que estoy utilizando sus archivos y cuando hago un filtrado en la correspondencia el word resultante es correcto pero al dividir y hacer archivos independientes me genera todos los que aparecen en el excel. Seguro que hay algo que hago mal

    1. Hola Ángel.

      Efectivamente, es que la macro no está programada para trabajar con un rango filtrado. lo realiza con toda la tabla. Si tengo tiempo, realizo esa actualización. Se debería realizar en la instrucción SQL con un where para importar los datos de Excel a word ya seleccionados con una condición.

      Otra opción es no filtrar y pasar la información por bloques en cada ejecución. Saludos.

  14. Hola! No hay manera de que me reconozca el nombre de la hoja de Excel, me dice que el nombre no es válido. He puesto la línea siguiente:

    obSQL = «SELECT [Hoja1$].[NumExpedient] FROM [Hoja1$]»

    Yo creo que el nombre Hoja1 es perfectamente válido, no?

    Un saludo y gracias

    1. Hola Ramón

      Sí, ese nombre no tiene ningún problema.

      Verifica que no tengas espacios en blanco. De todas formas tendría que ver el archivo para poder decirte algo. Una pregunta, te has bajado mi ejemplo y lo has ejecutado? Es para verificar que lo sea un problema de con versiones.

      Saludos

      1. Ya está, lo he conseguido! Ha funcionado cuando he utilizado una nueva hoja de cálculo con mis datos, seguro que habia algo raro en mi primera hoja que impedia que funcionara la macro. Muchas graciaaasss! Además he usado la macro que crea también los documentos en formato pdf. Me ahorraré un monton de tiempo, gracias de nuevo! (APLAUSOOOS!)

  15. Hola muyy agradecido por la macro yo estoy ejecutando tus archivos y con la macro guardado WORD Y PDF pero quisiera que me ayudes para que cuando guarde se agregue el nombre de WORD y el nombre de cada persona ( esto esta claro en la macro)

  16. Perdon por no dejarme entender. segun tus ejemplos quisiera que pararesca en los archivos generados con el siguiente nombre guardado :

    «documentos-generados – GOIKOLEA AQUILINO, GLORIA.pdf» y asi de todo

    donde «documentos-generados» obviamente que es el archivos generador

    Saludos un fuerte abrazo gracias de ante mano

    1. Hola John: Solo tienes que indicar lo siguiente: Solo es concatenar.

      Para PDF
      OutputFileName:=»documentos-generados – » & mi_archivo

      Para excel:
      FileName:=»documentos-generados – » & mi_archivo

      1. Que tal muy buena, gracias pero podría existir la forma donde documentos-generados sea el archivo que uno este abriendo, en pocas palabras poner la macro y no estar editando macro por macro —-
        OutputFileName:=»Documento el cual estoy para generar» & mi_archivo

        1. No comprendo qué es lo que quieres hacer. Vamos a ver, tienes un archivo en el que realizas combinar correspondencia y luego ejecutas la macro en word para «trocear» cada hoja como un archivo. Ese archivo lo renombras con el nombre de titular. Si deseas otra información, debes tener en cuenta otro campo en el excel.

          Si lo único que quieres es que se añada el nombre del documento de Word: eso lo haces así: ThisDocument.Name con el que obtienes el nombre del documento en el que estás.

          Saludos.

  17. Hola, mucha gracias me funciona todo bien, me genera los 2 formatos *.docx y *.pdf.
    Pero necesito que al generar el PDF se puede colocar una contraseña independiente por ejemplo Rut o RUN.
    Asi poder cifrar el documento con una contraseña.

    Saludos.

    1. Hola Carlos:

      El documento en PDF requiere el uso de complementos que todavía no he probado para incluir una contraseña. No es como word que la podemos incluir al guardar como. Tendría que estudiarlo.

      1. Gracias,
        pero tengo otro problema.

        Como te comente anteriormente con tus archivos de ejemplo corre súper bien, pero al modificar con mis datos solo me genera el primer archivo, luego arroja error “se ha producido el error ‘5941’ en tiempo ejecución, el elemento del conjunto solicitado no existe

        Al depurar marca la línea del problema
        Set texto = fdocument.Sections(i).Range

        Como dato:
        En el archivo Excel tengo 3 registros que estoy probando, en la cual lo combino en el archivo word de una Pagina.

  18. Hola Segu, muchas gracias por compartir tus conocimientos.

    Estoy intentando replicar tu código para unos archivos y no me funciona por el mismo error #3021 con el replace, hice el cambio con la solución inicial que vi en este foro pero sigue generandome el mismo error. Probé tu ejemplo y pasa lo mismo. Cual seria la causa?? Gracias por la ayuda!

    1. Hola Lily: Acabo de descargar el ejemplo del post y funciona perfectamente. El ejemplo funciona para office 365 y debería hacerlo también para Excel 2016 y superiores.

      Tendría que analizar los datos para comprobar cuál es el problema. Pero actualmente por motivos de salud no podré responder en bastante tiempo.

      Saluds.

  19. Hola, estoy con un erorr 94 pero en aquellos casos donde el listado tiene menos de 100 casos. ¿Tiene algo que ver la cantidad de registros?
    Al margen, realmente genial la macro y todo lo que haces aquí. ¡Muchas gracias!

    1. Hola Ezequiel:

      No tiene nada que ver la cantidad de registros. Verifica que la estructura de los datos son iguales que los del ejemplo y sigue detenidamente las instrucciones del post.

      Saludos y gracias!

  20. Buenas tardes, he descargado tus archivos y he hecho la prueba y ha funcionado perfectamente pero en mi archivo que es de mas de 741 registros me sale el error 5491 y la depuración sale resaltada la siguiente parte del código Set texto = fdocument.Sections(i).Range. Por favor me puedes ayudar

    1. Hola Catalina:

      He reproducido el archivo que me has enviado y funciona correctamente, genera todos los documentos.

      Por favor, prueba de nuevo en el mismo equipo o en otro distinto y verifica de nuevo.

      Si, como indicas, te ha generado el resto de documentos, lo lógico es que te genere el resto. Lo que me imagino que te ha ocurrido es que has seleccionado algún documento word distinto al que ejecuta la macro y eso ha generado el error. Cuando ejecutes la macro, déjala trabajar hasta el final sin abrir o seleccionar otros archivos de word.

      Debería funcionar correctamente.

  21. Buenos días,

    Antes de nada, muchísimas gracias por la dedicación.

    Me aparece un error cuando intento correr la macro. Al correrla, se me abre un archivo con todos los nombres que se deberían usar para los nombres del fichero (Osea, se me abre un Word con los datos de la columna NOMBRE COMPLETO). Luego me salta el error 3021. Ya estoy desesperado, no sé que hacer!!!

    Lo peor de todo es que hace un rato lo he conseguido hacer y funcionaba bien, pero ahora falla y no sé porqué…

  22. Hola Segu: La macro no tiene la posibilidad de que coja los encabezados y pies de página? tenemos 1500 documentos para pasar de word a pdf, pero necesitamos que salga el encabezado. Me podrías ayudar.
    Gracias.
    Daniel

    1. Hola Daniel:

      La macro lo único que hace es pasar cada documento a PDF, pero previamente debes generar todos los documentos con combinar correspondencia en Word y luego con la macro se «trocea» el archivo generado en los documentos necesarios.

      En el post lo puedes ver, sigue los pasos detenidamente y deberías lograrlo sin problema (ojo, siempre que cada uno de esos 1500 tengan una longitud de una hoja).

      Saludls.

      1. Hola, estás en lo cierto. Pero cuando trocea el documento en todos los words y pdfs, no está recogiendo el encabezado que sí había en el documento original. Cómo se podría hacer esto?

        1. Hola Carlos:

          En el proceso, lo que realizar la macro es la copia de todo el texto y formato de cada una de las hojas y los pasa a una hoja nueva que nombra con el ID que hayas elegido.

          No tiene en cuenta encabezados ni pies de página u otros elementos. No existe documentación en la red para realizarlo con encabezados. Tendría que estudiarlo detenidamente e intentar un nuevo código, pero en estos momentos estoy en reposo debido a una intervención quirúrgica. Intento verlo en cuanto tenga tiempo.

          Saludos.

  23. Hola a todos! me sirvió muchísimo esta macro, muchas gracias por publicarla!. Cabe destacar que los documentos nuevos no respetan el tipo de papel ni los margenes del original, para ello deben agregar los siguientes cambios a la macro:
    1) Agregar nuevas variables (después de ultima linea de Dim):
    Dim b As Single, t As Single, l As Single, r As Single

    2) Guardar los margenes del documento original (despues de la linea Set fdocument = ):
    b = fdocument.PageSetup.BottomMargin
    t = fdocument.PageSetup.TopMargin
    l = fdocument.PageSetup.LeftMargin
    r = fdocument.PageSetup.RightMargin

    3) Asignar a cada documento nuevo los margenes originales (despues de la linea Set target_a = Documents.Add):
    With target_a.PageSetup
    .PaperSize = wdPaperLegal
    .LeftMargin = l
    .RightMargin = r
    .TopMargin = t
    .BottomMargin = b
    End With

    En mi caso le asigne directamente el tipo de papel Legal (Oficio) a los documentos nuevos

      1. Buenas noches!!! Muchas gracias por todo su aporte; le comento mi inconveniente, modifico la macro con las indicaciones que da gustavo y me sale error de compilacion 424; resalto que lo hago porque efectivamente al generar los documentos me cambia tamaño a carta, y ellos originalmente estan en word, pero no he podido arreglar ese error

        1. Hola Luisa: Desconozco cual puede ser el problema, los parámetros que indica Guscavo funcionan correctamente. verifica que los has introducido correctamente, puede que sea este el problema.

          Saludosl

          1. Hola, ese error te sale ya que en la linea Set target = Documents.Add tienes que agregar «_a» luego de target, quedaria asi; Set target_a = Documents.Add
            Ahora bien, que tengo que agregar para que se guarde en orientacion horizontal??. seria lo ùltimo! hahahaha

    1. Muchas gracias Segu y Gustavo. Estoy intentando que los márgenes del los documentos individuales guarden el mismo espacio y tamaño de hoja que el documento general, estoy usando la macro sugerida por Gustavo pero en el paso 3: me genera el error 424: y se refiere en especifico a esta parte: With target_a.PageSetup. me pueden brindar una solución? De antemano muchas gracias

      1. Hola Manuel:

        Lo acabo de probar y no genera ningún error.

        – Vuelve a copiar tal y como comenta gustavo las partes de la macro.
        – sigue detenidamente los pasos para generar la macro leyendo de nuevo el post.

        Ten en cuenta que si tienes otro archivo word o excel puede provocar errores si se seleccionan mientras se ejecuta la macro.

        Saludos.

  24. Hola Carlos:
    Gracias por compartir la macro me está sirviendo de mucho.
    Hasta ahora he logrado que mis expedientes me salgan individuales y en formato doc y pdf.
    He intentado que además me salgan en formato odt, pero soy incapaz de hacerlo. No sé siquiera si es posible.
    Muchas gracias por anticipado a tu respuesta.
    Un saludo. Andrés

  25. Hola Carlos,

    Muchas gracias por tu aportación! Por desgracia, me quedé parado con este error:

    «Run-time error 3021:

    Either BOF or EOF is True, or the current record has been deleted.
    Requested operation requires a current record.»

    ¿Podrías echarme una mano?

    Gracias!

    1. Hola Guillermo,

      Revisa los datos y sigue los pasos detenidamente del post. Ese error hace referencia al recorset,. Es muy probable que el error surja por algún tipo de detalle que has dejado.

  26. Muchísimas gracias por este código y por su gran explicación, que me ha servido para hacer el merge a PDF sin problemas.

    Sólo me gustaría saber cómo asegurara que el formato de los documentos que se generan son exáctamente como el de origen, puesto que se descuadran las tablas y tipos de letra que tiene la plantilla.

    Gracias nuevamente.

  27. Hola Eduardo:

    El formato se tiene en cuenta en la macro aquí:

    target_a.Range.FormattedText = texto

    Igualando el formato.

    En los comentarios, Gustavo te explica cómo se pueden modificar los márgenes.

    Saludos.

  28. Hola Segu,

    Muchas gracias por compartir la macro y responder a todos los comentarios. He leído que tratarás de modificar la macro para archivos con más de una página ¿Existe ya esa nueva macro?
    Saludos

    1. Hola Rafael:

      Muchas gracias, me alegro que te haya resultado de interés la macro. Por desgracia todavía no me he puesto con el desarrollo de la macro. Estoy convaleciente de una intervención importante y necesito un tiempo de recuperación. En cuanto pueda lo intento ver.

      Saludos.

  29. Disculpa Segu una pregunta, cuando lo trato de ejecutar con mis archivos me sale Error de compilación No se ha definido el tipo definido por el usuario…que será?, Gracias por tu ayuda.

  30. Hola Segu, te escribo para agradecer tu Macro para generar el DOC y el PDF, es lo que estaba buscando y funcionó muy bien. Tengo un documento de 7700 paginas que necesitaba fraccionar en archivos independientes.
    Si se pudieran copiar los encabezados y pie de paginas seria perfecto. En mi caso conseguí engañar a la macro colocando Las imagenes del encabezado y del pie de pagina dentro del documento. La unica contra es que en las paginas que tienen una extencion de uno o dos renglones mas que las demas la imagen del pie de pagina sale movida. Lei que varios te han consultado por este tema, has podido investigarlo? existe alguna posibilidad que la macro incluya los encabezados y pie de pagina? Si conseguiste resolver esto te agradeceria infinitamente si pudieras compartirlo.
    Ojala te encuentres bien de la intervencion quirurgica. Abrazo desde Buenos Aires.
    Saludos

  31. Hola Bernardo:

    Pues todavía no he tenido tiempo de trabajar en los encabezados y pie de página. Sobre el tema de los márgenes, uno de los lectores ha indicado cómo modificarlos, es posible que esto te sirva de ayuda.

    Saludos.

    1. Por suerte no tengo problemas con los margenes. La única molestia, en mi caso, es que son 4 documentos, de los cuales 2 tienen ocupan un renglón mas. Como no me tomaba las imágenes en el encabezado y pie de pagina, termine poniendo estas imágenes en el documento, y el pie de pagina varia un poco su posición según si es el documento de un renglón mas o si es el de un renglón menos. Por eso si se pudiera usar los encabezados, la macro seria como decimos por aquí «un golazo».
      Abrazo

      1. Gracias!!!!,

        Coloqué todo el encabezado como imagen, es decir imprimí la pantalla y recorte en paint sólo en encabezado, éste lo guardé como imágen. Modifique el margen superior del documento y pegué la imagen de mi encabezado a la altura deseada y listo. Mugras gracias a todos por sus contribuciones y gracias infinitas a Segu.

    2. hola buenos tardes, me podrias explicar como hiciste para engañar la macro y que te trajera los pies de pagina.. en mi caso en los pies de página esta el logo de la empresa por lo que necesito que salga en el documento word destino.

      1. Hola Silvia, lo que hice fue achicar los margenes superior e inferior. En ves de poner las imagenes en el encabezado y pie de pagina, lo hice directamente en el documento. Por lo visto la macro no toma los encabezados y pie de paginas. En mi caso me sirvió. Eran 4 archivos donde uno tenia un renglon de mas, por ende en ese archivo el pie de pagina me salía un poco mas abajo porque la imagen esta en el cuerpo del word y no en el pie.

  32. cordial saludo gracias por la herramienta me ha sido muy útil en varias ocasiones pero hoy me registra este error.

    se producido un error 5941 en el tiempo de ejecución y de doy depurar y me muestra lo siguiente en resaltado

    Set texto = fdocument.Sections(i).Range

    No se como solucionarlo

    1. Hola Andrea:

      Ese error aparece cuando el documento del que se buscan los datos no está abierto. Es posible que mientras hayas generado los documentos, hayas seleccionado algún documento que no procede en lugar del documento con los datos generados.

      Inténtalo de nuevo fijándote en el word que tienes activo. Si tienes en ordenador otros archivos de word externos (de otras cosas), ciérralos. Utiliza solo los documentos necesarios y una vez iniciado el proceso no selecciones nada, déjalo terminar.

      Saludos

  33. Hola Segu! Muchas gracias por tu aporte, la verdad que estoy al 99% de cerrar un proyecto en el cual me han pedido ayuda y me base en tu macro sin nigun inconveniente.
    Solo me resta poder definir la orientacion de la hoja, necesito que salga en horizontal, tal cual como esta en el documento origen.

    Estuve leyendo y vi que setean la propiedad PageSetup.Orientation pero no se que valor asignarle.
    Slds!!

    1. Hola Emiliano:

      El valor para que la hoja en horizontal es: = wdOrientLandscape

      De todas formas si el combinar correspondencia de la macro lo haces en horizontal, creo que luego pasar la macro te debería grabar los documentos en horizontal.

      Saludos.

  34. Hola!

    A mi no me funciona, es decir, me crea una hoja en blanco y ahi escribe uno de 9 campos.
    Aclaro que estos estan combinados…que le hacemos?

    1. Hola: Cómo que te crear una hoja en blanco, qué mensaje de error te aparece?. No entiendo muy bien la consulta. De todas formas, antes de iniciar tu ejemplo con tus datos, ejecuta el ejemplo que está en el post, paso a paso. y una vez que lo hayas reproducido hazlo con tu información. Así verificarás que el programa funciona en tu equipo y no se debe a problemas de versiones.

      Saludos.

  35. Buenas tardes,

    Placer saludarles, hago todos los pasos de una manera correcta , no obstante, me arroja el error New ADODB.connection «error de compilación: No se ha definido el tipo definido por el usuario», les aseguro que sigo los pasos al pie de la letra. Por favor su ayuda.

  36. Excelente trabajo, aún no lo corro, pero me gustaría saber si se puede enviar a PDF y agregar una contraseña individual a cada archivo PDF, saludos.

  37. Buenas tardes, primeramente agradezco la información, muy útil, he recopilado todas las observaciones y he podido ajustar el código para que cree los archivos con el formato original. Sin embargo, aún no he encontrado la solución para que los documentos nuevos conserven los encabezados y pies de paginas (en caso de tener logotipos, imágenes, texto, etc). Alguien ya encontró la solución a esto? Se los agradecería muchísimo

  38. Hola compañero, realice el proceso que indicaste y me sale el error 5941, el elemento del conjunto solicitado no existe, y hace referencia a Set texto = fdocument.Sections(i).Range, en la sentencia de visual, al final solo genera el word del primer dato, ayudame por favor.

  39. Hola Danny:

    Tendría que ver la información con la que estás trabajando. ¿Has seguido punto por punto el post?. ¿has reproducido el ejercicio en tu PC con los datos de mi ejemplo??.
    Es importante que cuando ejecutes la macro no estés seleccionando otros libros u otros documentos. Deja que la macro se ejecute completamente. El error que indicas se refiere a un libro de word sin abrir.

    Lo dicho verifica la macro detenidamente y sigue paso por paso.

    Saludos.

  40. Hola,

    He seguido los pasos de Gustavo ya que me cambia el formato cuando genero los documentos independientes. No obstante, me sale «Run-time error»424»: Object Required. Y despúes, cuando miro qué es, me dice que el problema está en: With target_a.PageSetup

    ¿Podrías ayudarme?

    Muchas gracias,

    Maria

    1. Hola María:

      Verifica que no has eliminado Set target_a = Documents.Add):

      El error indica que no se encuentra el objeto target_a y que está declarado en la línea anterior.

      Saludo,s

  41. Excelente, pude sacar los archivos individuales; creo que quizá haga falta hacer las indicaciones mas precisas para que se entienda mejor. tambien mi pregunta es si se podrá obtener en otro tipo de archivos individuales como en PDF, o JPGE por ejemplo. Gracias y buen articulo

    1. Hola Erick:

      Gracias a ti. Sobre el poder guardar con otros formatos, el de PDF lo tienes en uno de los comentarios que respondí, revisa los comentarios. ahí tienes la respuesta.

      Saludos.

    1. Hola Génesis:

      Es necesario programar para lograr lo que indicas. De todas formas en los comentarios un lector ha trabajado sobre los márgenes y es posible que sea de utilidad. En estos momentos no tengo equipo (un problema con la placa base).

      Saludos

  42. hola muchas gracias me funcionó, el único problema es que al guardar el documento cambió el tamaño de la hoja por lo cual me desconfiguró el archivo, cómo puedo hacer para mantener el formato??

    1. Hola Karla:

      Tendría ver cuál es el problema con un ejemplo. No obstante si utilizas el formato predeterminado de márgenes etc. Deberia funcionar perfectamente.

      1. Gracias por responder, es una notificación de descuento realizada con tablas en formato A4 y márgenes estrechos, pero modifiqué el archivo en formato carta y con márgenes normales, así al ejecutar la macro no me cambia el formato y ya no tuve problemas

  43. Hola, muchas gracias por compartir su conocimiento. Tengo una Duda, ¿Existe la manera de seleccionar manualmente la hoja sin necesidad de entrar a la macros nuevamente para cambiar el nombre de la hoja? Gracias

    1. Hola Radio Poético:

      Es un proceso programado y en principio no deberías realizar o interferir con la macro para que realice correctamente la acción.

      Saludos

  44. Hola Segu, gran aporte hermano, todo funciona genial. Quisiera que me ayudaras a generar ya no solo 1 hoja, si no de 2 a más hojas. Si fuera posible agradecería mucho tu aporte. Saludos.

    1. Hola Gian:

      Tengo pendiente investigar y programar el código para ampliar el número de hojas, es bastante complicado y no dispongo de tiempo, por el momento no podré actualizar la macro.

      Saludos.

  45. Muchísimas gracias por el código, realmente muy útil para los que tenemos que hacer múltiples documentos y partirlos luego. El añadido de crear ya también los PDF ha mejorado incalculablemente el aporte.

    Si me permites, te añadiría un par de cosas que he observado con la utilización del código:

    – En MAC, nada que hacer

    – En Windows perfecto, pero he sufrido los errores típicos del resto, os relato:

    – el error que genera – campo = Replace (dataread.Fields (0), «-«, » «) -, solucionado creando una segunda Excel con SOLO los nombres de fichero que queremos que tengan los documentos, coincidiendo por orden con la excel original. Cuando el código pregunta de que Excel «leer» los nombres de ficheros usa esta reducida con solo el nombre y no me da el error que no permite continuar. La Excel original de la correspondencia tiene muchos datos y variadas, el motivo por el que da el error lo desconozco.

    – formato del documento Word generado y por consiguiente el PDF que se autogenera. Con cambiar la plantilla por defecto de WORD a la plantilla que queremos que tenga los documentos generados solucionado. de esta forma el documento que genera el código coge esa plantilla y genera un nuevo documento con todo lo que queramos que tenga, formatos, gráficos, etc. Luego se vuelve a la plantilla normal y ya tenemos Word «original» de nuevo.

    Muchas gracias de nuevo por el código.

      1. Hola buenas tardes quisiera saber si se ha podido encontrar la soluciòn para que traiga la informacion y logos en los pies de pagina.

      2. Sagu buenas tardes, encontre el siguiente codigo, que permite separar los documentos ya combinados, y respeta los pies de pagina y los logos, sin embargo la macro no esta vinculada con excel para que guarde los documentos con los nombres que necesitamos, depronto en tu experticia puedas revisarla y modificarla o simplemente tomar de esta macro la idea para incorporar a la que ya hiciste para que a la hora de correr la macro, genere el nuevo documento, respetando pies de pagina, y formatos… te agradezco si a puedes revisar y modificar…para que nos sirva para los que necesitamos conservar los pies de pagina.. mil gracias

        Sub SplitIntoPages()
        Dim docMultiple As Document
        Dim docSingle As Document
        Dim rngPage As Range
        Dim iCurrentPage As Integer
        Dim iPageCount As Integer
        Dim strNewFileName As String
        Application.ScreenUpdating = False ‘Hace que el código se ejecute más rápido y reduce la pantalla _parpadeo un poco.

        Set docMultiple = ActiveDocument ‘Trabajo en el documento activo _
        (El que contiene actualmente la Selección)
        Set rngPage = docMultiple.Range ‘instanciar el objeto de rango
        iCurrentPage = 1
        ‘obtener el número de páginas del documento
        iPageCount = docMultiple.Content.ComputeStatistics(wdStatisticPages)
        Do Until iCurrentPage > iPageCount
        If iCurrentPage = iPageCount Then
        rngPage.End = ActiveDocument.Range.End ‘última página (no habrá una página siguiente)
        Else
        ‘Encuentra el comienzo de la página siguiente
        ‘Debe utilizar el objeto de selección. El método Range.Goto no funcionará en una página
        Selection.GoTo wdGoToPage, wdGoToAbsolute, iCurrentPage + 1
        ‘Establecer el final del rango al punto entre las páginas
        rngPage.End = Selection.Start
        End If
        rngPage.Copy ‘copia la página en el portapapeles de Windows
        Set docSingle = Documents.Add ‘crea un nuevo documento
        docSingle.Range.Paste ‘pega el contenido del portapapeles al nuevo documento
        ‘eliminar cualquier salto de página manual para evitar un segundo espacio en blanco
        docSingle.Range.Find.Execute Findtext:=»^m», ReplaceWith:=»»
        ‘construir un nuevo nombre de archivo numerado secuencialmente basado en el nombre y la ruta del archivo de varias páginas originales
        strNewFileName = Replace(docMultiple.FullName, «.docx», «_» & Right$(«000» & iCurrentPage, 4) & «.docx»)
        docSingle.SaveAs strNewFileName ‘guarda el nuevo documento en una sola página
        iCurrentPage = iCurrentPage + 1 ‘se mueve a la página siguiente
        docSingle.Close ‘cierra el nuevo documento
        rngPage.Collapse wdCollapseEnd ‘ve a la página siguiente
        Loop ‘ve a la parte superior del bucle do
        Application.ScreenUpdating = True ‘restaura la actualización de la pantalla
        ‘Destruye los objetos.
        Set docMultiple = Nothing
        Set docSingle = Nothing
        Set rngPage = Nothing
        End Sub

        Aclaro la macro separa los documentos word, y los guarda pero con un nombre ya definido… ejemplo si se guarda el documento inicial con el nombre «CARTA.doc» el resto de documentos que separa los guarda como «CARTA 1.doc»..»CARTA 2.doc»..»CARTA 3.doc» y asi sucesivamente, por lo que implica que una vez los genera hay que cambiar el nombre manualmente.

        Ojala la puedas revisar, y modificar.. mil gracias.

  46. Hola Segu. Hace tres dias que estoy tratando de ver como solucionar el error 5941 no lo puedo solucionar. Si me podes ayudar te agradezco. Saludps

    1. Hola Cristian:

      Ese error aparece cuando el documento del que se buscan los datos no está abierto. Es posible que mientras hayas generado los documentos, hayas seleccionado algún documento que no procede en lugar del documento con los datos generados.

      Inténtalo de nuevo fijándote en el word que tienes activo. Si tienes en ordenador otros archivos de word externos (de otras cosas), ciérralos. Utiliza solo los documentos necesarios y una vez iniciado el proceso no selecciones nada, déjalo terminar.

  47. Hola Sagu quisiera saber si pudiste revisar el código que te enviá y que permite que al separar los word conserve pie de página y demás formatos del documento original, lo único que le hace falta a ese código, es que se enlace al excel, para que guarde los word con los nombres que elegimos.

    1. el codigo te lo deje en este mensaje.. por si no lo encuentras… mil gracias si pudieras revisarlo y modificarlo sería de valiosa ayuda.

      1. Hola Silvia:

        Actualmente tengo bastantes consultas pendientes por responder a lectores del blog, no me ha dado tiempo a ver el código y analizar tu petición, en cuanto pueda intento verlo.

        Saludos.

  48. Hola! Primero que nada muchas gracias por la aportación con este material que es de mucha ayuda. Tengo una duda ya que me sale un error:

    campo = Replace(dataread.Fields(0), «-«, » «)

    Lei los comentarios y vi que la recomendación es dejarlo sin el replace:

    campo = dataread.Fields(0)

    Pero me sigue generando error, me sale otra hoja de word con solo los nombres del listado que tengo pero no se genera ningun pdf ni word, que puedo hacer?

    Muchas gracias de antemano por la ayuda!

    Saludos,

  49. Buenas tardes, agradezco bastante por la función, pero el formato que genera no es mismo, tengo un word en horizontal , y al ejecutar esta función el nuevo word generado me sale en vertical.

    Quiera que con esta misma macro crea directo a un pdf.

    1. Hola Ivan:

      La macro genera los documentos en vertical para generarlos en horizontal puedes grabar un macro en word cambiándolos a horizontal e incluirlos en el código publicado.

      Respecto al PDF, por favor echa un vistazo a los comentarios, hay varias respuestas ya publicadas.

      Saludos

  50. Hola Segu,
    He seguido tu ejemplo y va muy bn, gracias, quiero preguntarte si es mas de un folio en word debo modificar algo en la macro?; leyendo no encontré si ya respondiste eso !
    Gracias saludos

  51. Ante Todo muchas gracias por el aporte, Pregunta ; en la instrucción para generar el documento nuevo ‘Generamos documento nuevo
    Set target = Documents.Add ? ? se puede modificar para que abra un documento tipo plantilla . MUchas Gracias

  52. Hola,

    quisiera saber si hay forma de incorporar el pie de página en el documento, ya que tengo un código de barras en cada carta y no se como hacerlo para que funcione.

    1. Hola Juan:

      Todavía no he podido implementar lo que indicas. Es posible que en los comentarios encuentres algún tipo de ayuda. En cuando tenga tiempo intentaré investigar si es posible incorporar el pie de página.

  53. Hola!
    Primero que todo agradecer lo valioso que es esto para aprender y aplicar en nuestros documentos.
    Segundo, Te comento que realicé en excel una lista de datos que debo traspasar a una plantilla de word, lo logré a través e la correspondencia PERO al usar una macro y querer guardarlo en archivos word separado para documento no logro hacerlo, ya que la macro está para que se guarde en pdf.

    Esta es la que uso.

    Sub GUARDAR_HOJAS_DOSTIN()

    ‘ Macro Dustiniana xD
    http://www.DostinHurtado.com
    ‘ Cursos gratis 😀

    Dim num_paginas As Integer
    Dim num_doc As Integer
    Dim pag_inicial As Integer
    Dim pagina_final As Integer
    Dim URL As String
    Dim nombres As String

    num_paginas = InputBox(«Ingrese el numero de paginas por documento»)
    num_doc = InputBox(«¿Cuantos documentos desea generar?»)
    URL = InputBox(«¿Donde desea crear los documentos?»)
    nombres = InputBox(«¿Que nombre tendran los Documentos?»)
    pag_inicial = 1
    pagina_final = num_paginas

    For i = 1 To num_doc
    ActiveDocument.ExportAsFixedFormat OutputFileName:= _
    URL & «\» & nombres & i & «.PDF», ExportFormat:= _
    wdExportFormatPDF, OpenAfterExport:=False, OptimizeFor:= _
    wdExportOptimizeForPrint, Range:=wdExportFromTo, From:=pag_inicial, To:=pagina_final, Item:= _
    wdExportDocumentContent, IncludeDocProps:=True, KeepIRM:=True, _
    CreateBookmarks:=wdExportCreateNoBookmarks, DocStructureTags:=True, _
    BitmapMissingFonts:=True, UseISO19005_1:=False
    ChangeFileOpenDirectory URL

    pag_inicial = pagina_final + 1
    pagina_final = pagina_final + num_paginas
    Next i
    End Sub

    Será posible me puedas ayudar y corregir la macros para que lso archivos que se guarden de forma individual se guarden en formato WORD?

    Muchas gracias!

    1. Prueba con esto:

      Añadiendo: FileFormat:=wdFormatDocument cuando nombramos y guardamos el archivo:

      ‘de la hoja que contiene los datos extraidos de Excel
      target_a.SaveAs Filename:=mi_archivo, FileFormat:=wdFormatDocument

  54. Hola!. Me figura un error de compilacion: no se ha definido el tipo definido por el usuario. Y me marca que el error esta aqui;
    Set cnn = New ADODB.Connection

    1. Verifica que has activado las referencias y que sigues todos los pasos del post detenidamente. Cuando lo hagas solo ten abiertos los archivos necesarios.

      Cuando muestra error en ADO significa que no se han activado las referencias.

      Saludos

  55. Disculpa, si quisiera guardar los archivos con otro campo del archivo Excel, en que parte de la macro tendría que cambiar esa variable.
    de ante mano muchas gracias

Si te ha gustado o tienes alguna duda, puedes dejar aquí tu comentario.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies