Hola a todos!, espero que todo os vaya bien 🙂
Llevo varias semanas que no publico nuevo material, el motivo no es otro que la falta de tiempo. Lo cierto es que entre la temporada veraniega, la reincorporación al trabajo y temas pendientes, se hace complicado sacar un momento para escribir nuevas entradas.
Estos días sin embargo, tuve tiempo para preparar un post bastante interesante. Como suele ser habitual, el tema surgió a raíz de una consulta de una lector. Me preguntaba acerca de la posibilidad de realizar combinar correspondencia en Excel y poder pasar cada uno de los documentos a PDF de forma individual.
Normalmente, el proceso de combinar correspondencia se inicia desde Microsoft Word y se accede a Excel para buscar la base de datos en la que tenemos la información necesaria para enviar la correspondencia. Prácticamente se pueden realizar todo tipo de envíos masivos y enviar la información a través de correo electrónico. También se pueden imprimir los documentos (es posible que con paciencia se puedan imprimir con algún programa a PDF de uno en uno, especificándolo en el cuadro de diálogo de la impresora).
Para más información sobre combinar correspondencia os dejo el siguiente enlace: COMBINAR CORRESPONDENCIA
Pues bien, en casi la totalidad de los casos podremos solucionar nuestras necesidades con Word. Pero si queremos pasar cada uno de los archivos que queremos enviar a PDF y guardarlos en un directorio, Excel es una buena solución. Para hacerlo, debemos construir nuestra propia aplicación de combinar correspondencia.
Después de este pequeño comentario, ya estamos listos para comenzar. Como siempre, vamos a ver la base de datos que hemos confeccionado para enviarles una comunicación, pestaña “DATOS”:
El siguiente paso ahora es crear la plantilla que vamos a utilizar para incorporar los datos a enviar. La plantilla la vamos a crear directamente en una hoja Excel, lo haremos teniendo en cuenta los formatos que podemos darle al texto en cada línea de la hoja, y además crearemos una serie de marcadores que luego vamos a utilizar para trasladar los datos de cada persona. Esta es la plantilla:
Como podéis observar, aquellos campos que hacen referencia a los datos que iremos incorporando en cada carta los marcaremos entre corchetes “<>”, luego en la macro haremos referencia a ellos para reemplazarlos.
Es importante que vayáis configurando en cada línea lo datos de la forma en la que saldrán finalmente, aunque esto lo podéis hacer realizando varias pruebas para depurar el diseño.
La plantilla “GENERAR” no contiene datos, será la hoja en la que se vuelque una copia de “PLANTILLA” y en la que iremos colocando cada registro de la hoja “DATOS”. Lo que sí es importante es que en la hoja “GENERAR”, las líneas y las columnas tengan en mismo ancho que la hoja “PLANTILLA”, o por lo menos tener en cuenta que el PDF final tendrá el mismo formato que la hoja “GENERAR”:
Ahora que ya tenemos la carta incorporada en nuestro archivo y las hojas creadas, ya podemos ir a la programación, debemos incluir esta macro:
Sub COMBINAR_CORRESPONDENCIA()
Dim i As Double
Dim ruta As String
Application.ScreenUpdating = False
'Activamos nuestro libro
ThisWorkbook.Activate
Sheets(2).Name = "GENERAR"
'seleccionamos hoja "GENERAR"
Sheets("GENERAR").Select
'Contamos el número de casos
Fin = Application.CountA(Sheets("DATOS").Range("A:A"))
'Elegimos la carpeta donde queremos guardar los archivos
On Error Resume Next
With CreateObject("shell.application")
ruta = .browseforfolder(0, Titulo, 0).Items.Item.Path
End With: On Error GoTo 0
'Si no elegimos la carpeta de destino, la macro se para
If ruta = Empty Then
MsgBox "DEBES SELECCIONAR UNA CARPETA DE DESTINO, PULSA DE NUEVO EL BOTÓN GENERAR", vbExclamation
Exit Sub
End If
'Iniciamos un for
For i = 2 To Fin
'Creamos variables para cada uno de los datos a incorporar en la hoja "GENERAR"
Nombre = Sheets("DATOS").Cells(i, 1)
Apellidos = Sheets("DATOS").Cells(i, 2)
Lugar = Sheets("DATOS").Cells(i, 3)
Fecha = Format(Sheets("DATOS").Cells(i, 4), "[$-C0A]d ""de"" mmmm ""de"" yyyy;@")
ExcelSignum = Sheets("DATOS").Cells(i, 5)
Email = Sheets("DATOS").Cells(i, 6)
Firma = Sheets("DATOS").Cells(i, 7)
'Llamamos a la macro Actualiza
Call ACTUALIZA
'Damos nombre a la hoja activa, que es GENERAR
ActiveSheet.Name = Sheets("DATOS").Cells(i, 1) & " " & Sheets("DATOS").Cells(i, 2)
With ActiveSheet
'Reemplazamos los datos en los marcadores que hemos creado en Plantilla
Cells.Replace What:="<NOMBRE>", Replacement:=Nombre, LookAt:=xlPart, SearchOrder:=xlByRows
Cells.Replace What:="<APELLIDO>", Replacement:=Apellidos, LookAt:=xlPart, SearchOrder:=xlByRows
Cells.Replace What:="<LUGAR>", Replacement:=Lugar, LookAt:=xlPart, SearchOrder:=xlByRows
Cells.Replace What:="<FECHA>", Replacement:=Fecha, LookAt:=xlPart, SearchOrder:=xlByRows
Cells.Replace What:="<EXCEL SIGNUM>", Replacement:=ExcelSignum, LookAt:=xlPart, SearchOrder:=xlByRows
Cells.Replace What:="<EMAIL>", Replacement:=Email, LookAt:=xlPart, SearchOrder:=xlByRows
Cells.Replace What:="<FIRMA>", Replacement:=Firma, LookAt:=xlPart, SearchOrder:=xlByRows
'Si queréis dar formato de hipervínculo a las celdas A6 y A10
'Solo tenéis que descomentar la parte indicada entre puntos:
'-----------------------------------------------------------
.Range("A6,A10").Select
With Selection
.Font.Color = RGB(0, 0, 255)
.Font.Underline = xlUnderlineStyleSingle
End With
'-----------------------------------------------------------
End With
'Publicamos en PDF, sin propiedades en el documento y sin abrir cada vez que se genere el PDF
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
ruta & "\" & ActiveSheet.Name, Quality:=xlQualityStandard, _
IncludeDocProperties:=False, IgnorePrintAreas:=False, OpenAfterPublish:=False
'Volvemos a renombrar la hoja2 como "GENERAR"
Sheets(2).Name = "GENERAR"
Next
End Sub
Con esta macro debemos adjuntar esta otra, a la que hacemos referencia en la macro principal:
Sub ACTUALIZA()
Dim Shape As Excel.Shape
'Limpiamos contenidos en hoja "GENERAR"
Sheets("GENERAR").Select
Columns("A:A").ClearContents
'Eliminamos imagenes en la hoja Generar
For Each Shape In Sheets("GENERAR").Shapes
Shape.Delete
Next
'Copiamos la plantilla base desde la hoja "PLANTILLA" a "GENERAR"
'Seleccionamos el rango de FILAS hasta donde tenemos texto o un rango superior
Sheets("PLANTILLA").Select
Rows("1:50").Select
Selection.Copy
Sheets("GENERAR").Select
Rows("1:50").Select
ActiveSheet.Paste
End Sub
Cuando la macro se ejecute, directamente nos va a preguntar por una ubicación (directorio) en la que queremos guardar cada uno de los PDF generados. Si no elegimos, saldremos la macro y se parará el proceso. Si la elegimos, la macro pasará los datos a la hoja “GENERAR” mediante el comando reemplazar y sustituirá cada uno de registros marcados a través de un bucle for-next.
La otra macro, lo que hace es limpiar de todo contenido la hoja “GENERAR” incluso objetos, como firmas escaneadas, imágenes, logos, etc y traslada el texto de la hoja “PLANTILLA”.
Finalmente, guardamos la hoja “GENERAR” denominando a cada PDF con el nombre de las personas, el resultado es este:
y la comunicación esta:
De esta forma tendremos todos los archivos en PDF y guardados en el mismo directorio.
En la macro, os he dejado parte del código comentado, ese código sirve para dar formato a los hipervínculos que se mostrarán en el PDF si queremos que se destaquen en azul y subrayados. Es solo una medida puramente estética, el hipervínculo funciona perfectamente.
Y esto es todo, espero que os sea de utilidad. 🙂
Importante: la macro ha sido probada en Excel 2010, 2013 y 2016. En 2007 debería funcionar correctamente, dado que permite pasar documentos a PDF. En versiones anteriores no funcionará.
Descarga el archivo de ejemplo pulsando en: COMBINAR CORRESPONDENCIA EN EXCEL Y GUARDAR PDF
Hola que tal, está bastante buena la aplicación y funciona perfecto, sin embargo me queda la duda en qué momento se ejecuta la macro HIPERVINCULOS
Me gustaMe gusta
Hola Christ,
La macro HIPERVINCULO no se ejecuta con la macro, estaba en un módulo a parte. Sin embargo, he repasado el post y he cambiado la macro por otra y la he integrado en la macro principal.
.Range("A6,A10").Select
With Selection
.Font.Color = RGB(0, 0, 255)
.Font.Underline = xlUnderlineStyleSingle
End With
Simplemente nos limitamos a dar formato a los hipervínculos (color azul y subrayado). Está comentado, si quieres que te funciona solo tienes que descomentarlo quitando las comillas simples.
Un saludo!!
Me gustaMe gusta
Buenos días,
Esta macro me viene genial, me resuelve casi todo lo que necesito, muchas gracias!!
Solo hay una cosa que no me resuelve, me gustaría poder mandar los diferentes archivo guardado por Email a sus diferentes destinatarios (el Email de los destinatarios estarían guardado en la hoja DATOS,(Columna H por ejemplo)
Esto se puede hacer?
Gracias de nuevo
Me gustaMe gusta
Hola Adrien,
En efecto, se puede hacer. Para ello es necesario, que declares estas tres variables en el código
Dim olApp As Object
Dim objMail As Object
Dim Archivo As String
y pegas esto después de haber guardado el pdf en la macro, es decir
……… OpenAfterPublish:=False
y ahora pegas esto:
Archivo = ruta & "\" & ActiveSheet.Name
Set olApp = CreateObject("Outlook.Application")
Set objMail = olApp.CreateItem(0)
With objMail
.Subject = "hola"
.To = Sheets("DATOS").Cells(i, 8).Value
.Attachments.Add Archivo & ".pdf"
.send
End With
Set objMail = Nothing
Set olApp = Nothing
Envía el pdf a la dirección de correo que pongas en la columna H
Saludos.
Me gustaMe gusta
Hola, muchas gracias por esta macro, es casi lo que necesitaba, solo una cuestión, cuando realizo un filtro sobre los datos crea pdfs de todos los registros y no sólo de lo filtrado, hay alguna manera de que únicamente combinara y creará pdf de lo filtrado.
Muchas gracias.
Raquel.
Me gustaMe gusta
Hola Raquel,
Prueba lo siguiente, has de modificar la macro:
Justo después del bucle: For i = 2 To Fin
Pones esto:
If Worksheets("DATOS").Rows(i).Hidden = False Then
Y cierras el condicional justo después de: Sheets(2).Name = “GENERAR”
Casi al final de la macro, poniendo:
end if
Simplemente le decimos a Excel que cuando una fila esté visible, genere combinar correspondencia, y si está oculta simplemente no hará nada.
Saludos.
Me gustaMe gusta
Hola esta macro esta excelente, me funciona de maravilla, pero tengo un inconveniente, no me esta creando todas las cartas de los registros que tengo; tengo 10 y solo me crea 8, yo tengo el nombre de la persona en una sola celda y asi mismo se guarda pero nose cual sera la parte que falta para que me siga generando los otros
Me gustaMe gusta
Hola Tatiana:
Tendría que ver la hoja con los datos que tienes. Aunque deberías verificar que no tienes filas en blanco y que los datos a combinar comienzan justo después del encabezado, en la fila 2. De lo contrario tendrías que modificar la macro según la distribución de los datos que tengas.
Sin ver el documento, diría que tienes dos o más encabezados o filas en blanco. Puedes enviarme un ejemplo de como tienes la estructura de los datos, la hoja DATOS, y echo un vistazo.
Saludos.
Me gustaMe gusta
Holaaa muchas gracias ya pude arreglar el problema, ahora quiero colocar el link de las cartas creadas en una celda para poderlas adjuntar y enviar al correo de cada persona; lo que no he podido hacer es esa parte pues las cartas están guardadas con el nombre completo y así mismo quiero que se ubiquen en su respectivo lugar. Podrías ayudarme
Me gustaMe gusta
Hola Tatiana:
Me alegro que hayas podido solucionar el problema. Sobre la nueva solicitud, fíjate en el comentario que hace Adrién (un poco más arriba) y la solución que le indico. Creo que es lo que necesitas.
Saludos.
Me gustaMe gusta
Hola ya pude hacer lo de las cartas, quedo super bien el trabajo de acuerdo a lo que necesitaba, muchas gracias tu macro me ayudo mucho y el codigo lo explicas todo a las mil maravillas… Mil gracias
Me gustaMe gusta
Muchas gracias Tatiana 🙂 Me alegra saber que te he podido ayudar y que todo te ha funcionado correctamente. Saludos y gracias a ti por el comentario.
Me gustaMe gusta
excelente aportacio, y si quisiera guardalo a word se podria ??
Me gustaMe gusta
Hola Bolaina:
Tendría que estudiar la posibilidad de guardar el dato en word, aunque ¿por qué hacerlo en Excel?, puedes hacer esa tarea desde word con combinar correspondencia:
https://support.office.com/es-es/article/Combinar-correspondencia-con-una-hoja-de-c%25C3%25A1lculo-de-Excel-858c7d7f-5cc0-4ba1-9a7b-0a948fa3d7d3?ui=es-ES&rs=es-ES&ad=ES&fromAR=1
Lo estudiaré y en los próximos días publicaré algo.
Saludos.
Me gustaMe gusta
Holaa De nuevo yo por aqui, ahora traigo un nuevo interrogante, tengo dos tipos de carta pero como hacer que se genere la carta respectiva dependiendo de una condicion o un dato que se encuentra en la hoja DATOS.
Agradezco tu colaboración otra vez 😉
Me gustaMe gusta
Hola Tatiana:
Sí se puede hacer, pero hay que modificar la programación original (pensada para un tipo de carta). He añadido una plantilla más y en la hoja datos un criterio, el nombre de la PLANTILLA.
Te dejo el acceso a esta versión en google drive
https://drive.google.com/file/d/0B2MZVcPxjhyPZ2lnOVNWVnFUQU0/view?usp=sharing
Saludos! 🙂
Me gustaMe gusta
Buenos días:
Me ha servido muchísimo esta macro! Pero tengo un problema, intento importar un campo llamado “Temario”, es un campo con bastante texto, y me da fallo.
No obstante si meto solo 3 o 4 lineas como temario todo correcto. Alguien sabe que sucede? Muchas gracias por la ayuda!
Me gustaMe gusta
Hola Álvaro:
Podrías enviar a excelsignum@yahoo.es ese ejemplo en concreto que te está ocasionando el error?, de esa forma se podría averiguar cual es el problema.
Ten en cuenta que en la macro y en el ejemplo los campos nombre y apellidos se usan también para nombrar la pestaña de la hoja y esta tiene una serie de limitaciones:
– El nombre de la hoja no puede superar los 31 caracteres.
– No ha de contener los siguientes caracteres: \ / ¿ ? * [ ]
– No puede quedar el nombre en blanco.
Si esto sucede mostrará un error en la siguiente línea:
ActiveSheet.Name = Sheets("DATOS").Cells(i, 1) & " " & Sheets("DATOS").Cells(i, 2)
La solución es utilizar o introducir un campo nuevo, como la firma etc … que no está nombrando las hojas.
Saludos
Me gustaMe gusta
Hola, me parece maravillosa esta marco, no soy experto en excel y no se como solucionar el siguiente problema. Cuando doy clic en el botón de genera, sale un error “DEBE SELECCIONAR PRIMERO EL DESTINO…”, pero no se como hacerlo. De antemano muchas gracias por su ayuda. Saludos
Me gustaMe gusta
Hola Hugg:
En la macro de este post no hay ninguna alerta donde se hable de Destino. ¿te refieres al post de Google maps?.
Me gustaMe gusta
Hola excelente ejemplo, muchas gracias… pero tengo un problema….he agregado mas columnas a DATOS y una es con bastante texto … y cuando hago el proceso de reemplazar me sale un error que dice: “Se ha producido el error ’13’ en tiempo de ejecución: No coinciden los tipos. ” Ese campo tiene un texto muy amplio…es como una especie de RESUMEN… me podrías ayudar. Gracias
Me gustaMe gusta
Hola Gary:
El error que te aparece es porque la cadena de texto que estás reemplazando supera los 255 caracteres, debe ser menor o igual a 255 caracteres. Son los límites de la función reemplazar.
Otra opción es que esa celda la trates como una variable y la iguales en la hoja del borrador, es decir no usar la función reemplazar para esa información, así no tendrías esa restricción.
Espero haberte ayudado.
Saludos.
Me gustaMe gusta
hola, genial post, me sirve bastante, sin embargo quisiera un poco de ayuda extra por fa, estoy tratando de llenar unos reportes de ensayos de laboratorio, ya que tengo bastantes ensayos, para ingresar valores numéricos me va genial tu ejemplo, sin embargo me gustaría agregar a cada reporte un par de fotos y una grafica de excel ¿es esto posible? de antemano muchas gracias
Me gustaMe gusta
Hola Javer:
Pues encontrar información en estos dos post:
https://excelsignum.com/2016/04/05/insertar-fotografia-en-control-de-imagen/
https://excelsignum.com/2015/10/17/generar-grafico-dinamico-con-vba/
https://excelsignum.com/2015/05/30/automatizar-minigraficos-en-nuestra-hoja-excel/
Pero supone incluir una gran cantidad de programación. Intenta realizar los cambios basandote en estos artículos, si tienes alguna duda, me puedes consultar aquí: excelsignum@yahoo.es
Saludos.
Me gustaMe gusta
Genial, muchas gracias, le caharrearé un rato, si surgen más dudas te comento, lindo día (Y)
Me gustaMe gusta
Hola.. me ha funcionado excelente.
Quisiera pedirte ayuda, para ver si además de generar los PDF individuales, puedo generar uno que consolide todos.
Muchas gracias!!
Me gustaMe gusta
Hola Karina:
Este post está programado específicamente como una alternativa eficaz a una carencia de COMBINAR CORRESPONDENCIA en word, que es precisamente el obtener de forma individual y en PDF la información.
Si lo que necesitas es consolidar todos, deberías usar combinar correspondencia. Para realizar ese trabajo en VBA, se debería modificar la macro de forma que vaya pegando todos los mensajes uno debajo de otro y definir los saltos de página para que cada uno coincida con una página. Tendría que programarlo, en cuanto tenga un momento, lo hago.
De todas formas, ten en cuenta que combinar correspondencia en word siempre será la mejor solución, dado es una función desarrollada para hacer ese trabajo específico.
Saludos.
Me gustaMe gusta
Muchas gracias por la pronta respuesta…
Con combinar correspondencia me funcionaría bien, pero necesariamente debo gatillarlo desde excel, por lo que si me puedes ayudar con eso, lo agradecería enormemente…
Saludos
Me gustaMe gusta
Hola Karina:
Te lo he enviado por correo. Espero que te sirva, saludos.
Me gustaMe gusta
Muchas gracias!!
Me gustaMe gusta
buenas tardes. Yo tengo unos formularios hechos en pdf los cuales quiero que se llenen automáticamente con los datos importados de una base de datos de excel. eso es posible? como se haria? Muchas gracias desde ya!!!
Me gustaMe gusta
Hola Danilo:
No sé a que te refieres con “unos formularios hechos en pdf”. ¿formularios realizados con Acrobat?, ¿formularios de Excel?. Tendrías que ser más específico en la consulta.
Saludos.
Me gustaMe gusta
Son formularios que los hice con el acrobat. Y tienen espacios para ser llenados. Yo quiero que se llenen automáticamente desde una base de datos. Como una correspondencia de word y excel pero mi archivo esta en pdf
Me gustaMe gusta
Hola Danilo:
Entonces poco te puedo ayudar dado que deberías realizar el trabajo desde el propio adobe. importar la información de un archivo (en este caso Excel), aunque también podría ser un CSV.
Si entras en la documentación y foros de adobe, encontrarás respuestas como esta, que seguro te son de utilidad:
https://answers.acrobatusers.com/Can-I-import-data-Excel-spreadsheet-fillable-PDF-Form-q113686.aspx
Me gustaMe gusta
Buen día, felicidades por la macro, esta excelente! y muy útil, sin embargo hay algo que quisiera cambiar y seria que al mandarlo por correo se pudiera incluir una firma que contiene texto e imágenes, como se haria?
Me gustaMe gusta
Hola Aja:
Te envío la respuesta por mail
Saludos.
Me gustaMe gusta
Hola, me ha gustado mucho la macro que usted ha desarrollado, sin embargo tengo la misma peticion de Karina del 6 de diciembre, me podria dar una copia de la modificacion que realizo para ella?? Muchas gracias.
Me gustaMe gusta
Hola Elkin.
Te he enviado el archivo a tu correo. Saludos.
Me gustaMe gusta
Segu, muy buena la aplicación. La he usado para generar diplomas con archivos JPG de fondo. Muy bueno.
Me gustaMe gusta
Gracias Ángel. Me alegra que te haya sido útil. saludos!!
Me gustaMe gusta
Excelente macro me ha servido muchísimo para poder combinar cartas de certificados, pero quisiera que me ayudaras con algo. Es posible que al momento de reemplazar los valores de la combinación con reemplace con algún formato especifico, por ejemplo que cuando reemplace e nombre o el apellido los coloque en negrita, o les cambie el color del texto. Muchas gracias por tu ayuda
Me gustaMe gusta
Hola: Stivison:
Puedes probar usando esto: para el nombre,
Cells.Replace What:="", Replacement:=nombre, LookAt:=xlPart, SearchOrder:=xlByRows
Pon esto debajo, coloreará todos los caracteres desde la posición 12 hasta la cien de color rojo
.Cells(4, 1).Characters(Start:=12, Length:=100).Font.Color = vbRed
Y así con el resto controlando donde empieza el texto a colorear
Saludos
Me gustaLe gusta a 1 persona
Hola excelente macro porfavor necesito ayuda como se puede hacer para que la hoja “DATOS” se pueda hacer con cualquier hoja que este activa
Me gustaMe gusta
Hola Eduardo:
La macro está diseñada para trabajar con una hoja específica, (datos) o cualquier otra, pero con una hoja activa, sería necesario reprogramar de nuevo todo el código. No basta con reemplazar la hoja Datos por activesheet.
En cuanto tenga un momento, estudiaré cómo hacerlo. Saludos.
Me gustaMe gusta
Muchas gracias, por favor seria de gran ayuda .estaré atento. saludos
Me gustaMe gusta
HOLA QUE GRAN APORTE, Pero tengo una necesidad, utilice una Plantilla que tiene colores en el fondo y en la letra, pero al generar el PDF queda en blanco y negro. ¿Como podria solucionarlo?
Me gustaMe gusta
Hola Pablo,
La macro está programada para trabajar con los datos, para el tema de los colores y formatos, lee en algunos de los comentarios donde explico como aplicar colores.
Saludos.
Me gustaMe gusta
Hola, una pregunta, yo busco hacer algo similar, tengo la base de excel con la información de personal, sin embargo esa información la tengo que transcribir a un pdf ya elaborado, mi pregunta es puedo generar la correspondencia de esta manera?
Me gustaMe gusta
Hola Mario:
Desconozco el procedimiento para pasar datos de un Excel a un PDF para incluir datos directamente. Saludos. Tendrías que investigar en los foros de acrobat para encontrar documentación. Saludos.
Me gustaMe gusta
Hola Segu. muchas gracias por esta información que nos sirve de gran ayuda. Mi duda es si esto mismo se podría usar para generar pdfs a partir de un pdf único donde cada pagina tiene que ser un pdf individual, combinandolo con un archivo excel a modo de indice, con una columna numero, que seria el nº de pagina y otra columna nombre, que es el nombre con el que quiero guardar cada pdf individual. Espero haberme explicado 🙂
Muchas gracias y un saludo
Me gustaMe gusta
Podrias adaptarlo para que se genere una nueva carta sólo cuando cambie el valor de una celda, y mientras tanto escriba los datos en una tabla diseñada en la plantilla.
Gracias
Me gustaMe gusta
Hola vblanquet:
No comprendo muy bien tu consulta, necesito que me expliques más concretamente qué es lo que quieres hacer.
Saludos.
Me gustaMe gusta
En primer lugar comentarte que me ha sido muy útil tu macro porque me permite generar pdf individuales y controlar el nombre de los ficheros. Esta cada vez es más importante con la implantación de la firma digital. Yo lo he adaptado a mis intereses y va perfecto. Lo que te planteaba es teniendo en datos más de una línea por destinatario, imprimir todas las líneas en él mismo pdf, creandose un nuevo pdf solo al cambiar el destinatario.
Este situación no tiene fácil solución en la fusión de word.
Espero haberme explicado y enhorabuena por tu blog
Me gustaMe gusta
Hola vblanquet:
Lo que planteas es complejo de resolver con la estructura de programación que tiene actualmente, dado que está pensado que cada línea es un destinatario. La única forma de realizar es incluir los nuevos campos en columnas en lugar de filas. Supongo que tienes datos en la base duplicados y por eso planteas esa pregunta. Pero la única solución viable es que pases esa información a nuevas columnas, dado que realmente se trata de la misma persona.
Saludos.
Me gustaMe gusta
Exactamente no son duplicados. Imagina que voy registrando las consultas que cada cliente hace durante un periodo, al finalizar el periodo a cada cliente le remito el detalle de las consultas hechas en el periodo. Para ello tendría una tabla de datos ordenada por cliente y una fila por cada consulta realizada. La idea es generar esta carta resumen con una macro similar a esta. Voy a intentar adaptarla incorporando un ciclo dentro del for que se repita mientras el cliente no cambie.
Espero haberme explicado bien esta vez.
Me gustaMe gusta
Es increible lo bien que manejas el tema, la creación de soluciones a la medida me deja asombrado. Muchas gracias por la información.
Me gustaMe gusta
Muchas gracias Juan Carlos! me alegra que te resulte de utilidad : )
Me gustaMe gusta
Hola Segu,
Antes de nada felicitarte por tu blog y la valiosa información que nos ofreces.. Gracias!!!!
Al hilo de la macro en la que se genera un pdf por cada fila y es enviada por mail a cada destinatario, me gustaría personalizar en el correo electrónico que se envía, en “Asunto” y en el campo “Body” personalizándolo con los campos obtenidos en la hoja de “Datos” e incluyendo en el mail una firma de correo..
Para una personalización más cómoda del correo electrónico, quizás podríamos añadir una hoja más en el libro de excel que se llame por ejemplo “Plantilla Mail” y así generar igualmente la personalización del mail como la del pdf desde VBA?
Ya nos dices..Muchas gracias!!!!
Me gustaMe gusta
Hola Víctor:
Tengo que estudiarlo, porque seguramente implique programar además de en VBA, también en Html. Estos días intento verlo.
Saludos.
Me gustaMe gusta
Hola, muchas gracias me ha servido bastante.
tengo una duda, si mi base de datos no inicia en la fila 1, puedo en algún punto cambiar este rango en tu macro.
Muchas gracias por tu ayuda
Me gustaMe gusta
Hola William.
Debes indicarlo en el loop For i = 2 To Fin
Donde el 2 es la fila en la que empiezan los datos. Indica ahi la fila en la que tus datos comienzan. Saludos.
Me gustaMe gusta
hola, que bien y muy interesante, quisiera saber si puede agreagarse al documento por ejemplo una tabla de datos, es decir que pueda agregar mas de una linea de informacion y generar mis pdf. muchas gracias.
sls
Me gustaMe gusta
Hola Osiel:
Actualmente está programado para leer en líneas, es decir si deseas incluir más información sobre un ID es necesarios que acomodes los datos en horizontal, no en una tabla. Saludos.
Me gustaMe gusta
Cordial salud
excelente programación, pero cada que genero regraba nuevamente los archivos y si tengo una base de datos grandes el proceso se demora un poco y solo necesito imprimir la ultima ingresada.
Seria posible elegir que carta generar a través de algún dato ejemplo nombre u otro dato que se le agrege a la base de datos como un consecutivo
De antemano muchas gracias por aportes tan espectaculares
Me gustaMe gusta
Hola Luis:
Eso lo puedes hacer incluyendo un if condicional después del for. Por ejemplo,
For i = 2 To Fin
If Sheets(“DATOS”).Cells(i, 8) = “x” Then
end if
next
end sub
Aquí, generará la carta de aquella persona que tenga una “x” marcada en la columna 8 de la hoja datos.
Saludos.
Me gustaMe gusta
Muchas gracias por su respuesta y disposición, grandes son los aportes que ofreces y sin ningún interés, seguiré pendiente de tu canal aprovechando sus publicaciones y conocimientos. de nuevo muchas gracias
Me gustaMe gusta
como reemplazar un texto en un documentos de word, (incluyendo en encabezados)
a partir de datos incluidos en una hoja de excel,
Me gustaMe gusta
Deberías probar con combinar correspondencia de Word. Es la herramienta específica para eso:
https://support.office.com/es-es/article/combinar-correspondencia-con-una-hoja-de-c%C3%A1lculo-de-excel-858c7d7f-5cc0-4ba1-9a7b-0a948fa3d7d3
Saludos.
Me gustaMe gusta
Hola Buenos dias,
La macro me ha funcionado perfecto, pero tengo uninconveniente por que he agregado varios datos y ahora me genera el error
“se ha producido el erro 9 en tiempo de ejecucion
subindice fuera de intervalo”
me podrias ayudar a entender por que surge este error, excelente post!!
Me gustaMe gusta
Hola Andrés cuando ejecutes la macro y salta el error, debes analizar en el código qué parte no está funcionando. Normalmente ese error surge porque no encuentra el objeto.
Tendría que ver los datos para confirmarlo.
Saludos.
Me gustaMe gusta
Hola Segu!
He visto tu macro y es casi lo que necesito, sin embargo, quiero ver si me puedes ayudar pues en lugar de generar los documentos PDF, yo necesito que se generen hojas de excel para poder conservarlas como archivo.
Será posible algún movimiento como ese?
Espero que sí.
Gracias y menuda Macro!
Me gustaMe gusta
Hola Genoveva;
Debes sustituir en la macro en la parte donde se encuentra esto:
End With
‘Publicamos en PDF, sin propiedades en el documento y sin abrir cada vez que se genere el PDF
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
ruta & “\” & ActiveSheet.Name, Quality:=xlQualityStandard, _
IncludeDocProperties:=False, IgnorePrintAreas:=False, OpenAfterPublish:=False
‘Volvemos a renombrar la hoja2 como “GENERAR”
Sheets(2).Name = “GENERAR”
Por esto otro:
End With
'Volvemos a renombrar la hoja2 como "GENERAR"
ThisWorkbook.Sheets(2).Copy
ActiveWorkbook.SaveAs ruta & "\" & ActiveSheet.Name, FileFormat:=51
ActiveWorkbook.Close
ThisWorkbook.Sheets(2).Name = "GENERAR"
Next
Me gustaMe gusta
Muchísimas gracias Segu. La pruebo y vuelvo para acá a comentarte.
Me gustaMe gusta
Quiero que en vez de generar varios pdf los generé en varios Excel , que cambiaria en el código? Gracias
Me gustaMe gusta
Manuel:
En el comentario anterior podrás ver la solución. Haz los cambios en la macro y prueba.
Saludos.
Me gustaMe gusta
Que tal, segu, como estas? Tu articulo esta excelente, solo quisiera ver si me puedes ayudar con una duda que tengo, necesito solo crear el pdf de un solo registro en este caso de una sola personal, entonces, existe la manera de filtrar o preguntar solo que persona queremos generar el archivo pdf y que solo se genere ese pdf? Buen dia. Saludos.
Me gustaMe gusta
Hola Jonathan:
Echa un vistazo a los comentarios, en especial en el que respondo a Luis. Ahí tienes una forma de solucionarlo.
Saludos.
Me gustaMe gusta
Hola Segu! Muchas gracias por el aporte, me ha funcionado bastante bien. Sin embargo, al reemplazar una celda en específico (0003245 por ejemplo), al exportar a la sheet “GENERAR”, retira el formato incluyendo los ceros al principio. Intenté modificar en la segunda macro [Actualiza], para conservar el formato, pero no funciona. Alguna sugerencia?
Gracias de antemano.
Me gustaLe gusta a 1 persona
Hola Jonathan:
No comprendo muy bien el problema, ¿es por que retira los ceros?, si es así aplica en la hoja Generar el formato texto en todo el rango de la carta. Te pasará todos los ceros a la izquierda dado que tendrá formato texto.
Saludos
Me gustaMe gusta
Buenas tardes, Segu, muchas gracias por el aporte, tus comentarios y aportaciones son muy valiosos; me gustaría que me ayudaras ya que no necesito que se conviertan en pdf, sino en lugar de eso genere una nueva hoja con el nombre correspondiente de cada quien.
Espero puedes ayudarme.
saludos
Me gustaMe gusta
Hola Jiar:
Creo que lo preguntas es lo mismo que ha solicitado Genoveva en un comentario un poco más arriba. Prueba la solución que le he dado.
En lugar de PDF genera hojas un archivo Excel con el nombre.
Saludos.
Me gustaMe gusta
Segu, Antes de todo felicitaciones pro la verdad funciona perfectamente.
Te queria consultar si es posible en el cuerpo del Email escribir algo?
*Necesito poder escribir una frace en el cuerpo del email y si también es posible poder poner el asunto del mismo correo una etiqueta
Ejemplo .Subject
Muchas Gracias
Me gustaMe gusta
Hola Franco:
Tendrías que incluir una nueva columna denominada Subject y en cada línea el contenido del mensaje. Obviamente modificar en la programación e incluir los nuevos datos.
Me gustaMe gusta
Segu mil disculpas pero no entendí mucho. No logro seguirte.
Aparte de poder escribir en el cuerpo del correo. me gustaría
que en el asunto salga el nombre. Cosa que probé hacerlo pero no salia nada.
Me gustaMe gusta
El siguiente código crea las cartas con respecto a una base de datos… no importa el numero de columnas… si algo me escriben y les envio ejemplo…
Sub cartas()
patharch = ThisWorkbook.Path & “\Carta Incremento.dotx”
‘
For i = 2 To Range(“A” & Rows.Count).End(xlUp).Row
Set objWord = CreateObject(“Word.Application”)
objWord.Visible = True
objWord.Documents.Add Template:=patharch, NewTemplate:=False, DocumentType:=0
‘
For j = 1 To Cells(1, Columns.Count).End(xlToLeft).Column
textobuscar = Cells(1, j)
objWord.Selection.Move 6, -1
objWord.Selection.Find.Execute FindText:=textobuscar
‘
While objWord.Selection.Find.found = True
objWord.Selection.Text = Cells(i, j) ‘texto a reemplazar
objWord.Selection.Move 6, -1
objWord.Selection.Find.Execute FindText:=textobuscar
Wend
‘
Next
‘
ruta = ThisWorkbook.Path & “D:\Incremento”
nombd = ruta & Cells(i, “A”) & “.docx”
nombp = ruta & Cells(i, “A”) & “.pdf”
objWord.ActiveDocument.SaveAs
objWord.Quit (False)
Next
MsgBox “Cartas Generadas Correctamente”, vbInformation, “CARTAS GENERADAS”
End Sub
Me gustaMe gusta
Hola Segu,
Mil gracias por tu aporte, es sumamente útil para cualquier proceso que requiera envío de correspondencia. Consulta, cómo puedo incorporar algún texto en el cuerpo del correo?
Abrazo!
Me gustaMe gusta
Hola Ignacio:
Este post es para generar PDF individuales (que es una de las funcionalidades que no tiene combinar correspondencia en word), para el tema de enviar correos lo puedes hacer perfectamente desde WORD usando combinar correspondencia y usando la vista html.
https://support.office.com/es-es/article/combinar-correspondencia-con-una-hoja-de-c%C3%A1lculo-de-excel-858c7d7f-5cc0-4ba1-9a7b-0a948fa3d7d3
Te dejo otro enlace de interés:
https://excelsignum.com/2018/01/28/enviar-firma-con-imagen-y-texto-desde-outlook-usando-excel-y-vba/
Saludos!!
Me gustaMe gusta
Hola Segu, te cuento me ha ido muy bien con la herramienta, he logrado optimizar mas de un proceso, gracias por compartir el conocimiento! Tengo una duda, en un proceso que estoy llevando me está generando 2 hojas en el pdf, y la segunda en blanco. He probado restringiendo esta parte del código hasta la fila que contiene datos, por ej:
Sheets(“PLANTILLA”).Select
Rows(“1:50”).Select
Selection.Copy
Sheets(“GENERAR”).Select
Rows(“1:50”).Select
ActiveSheet.Paste
Y donde dice 50 lo he dejado en 37, que es la ultima fila con datos, pero aun así sigue generando una segunda hoja en blanco. Podrías ayudarme?
Saludos!
Me gustaMe gusta
Hola Ignacio:
Pon la hoja con vista salto de página y asegúrate que solo está seleccionada la hoja y no existen varios saltos de página.
Saludos.
Me gustaMe gusta
Segu, funciona perfecto. Una vez más gracias!!!
Me gustaMe gusta
Hola Segu, estoy teniendo otro problema. Ejecuté la macros para 35 registros y generó pdfs para todos, pero sólo para los primeros 30 se envió el correo. Esto tiene que ver con alguna configuración de la casilla outlook? o de la macros?
Me gustaMe gusta
Segu, ya lo resolví. No te molestes en responder!
Saludos.
Me gustaLe gusta a 1 persona
Pingback: COMBINAR CORRESPONDENCIA Y GUARDAR DOCUMENTOS INDEPENDIENTES | EXCEL SIGNUM
Amigo mío.
Me has ayudado bastante con tu conocimiento. Sin embargo, me queda una duda. Cómo puedo poner un campo en “negritas” o con “subrayado”. Si el campo que reemplaza con un dato, pero éste viene junto a un texto, por ejemplo, “Buen día, Sr(a) “, y quiero poner en “negritas” , cómo puedo hacerle sin que se modifique el resto del texto y sin necesidad de separar en celdas.
Si puedes ayudarme, te agradeceré eternamente.
Me gustaMe gusta
No entiendo por qué el post no me dejó escribir bien mi ejemplo.
No obstante, me gustaría saber, en tu mismo ejemplo que pones, cómo poner en negritas el nombre, sin tener que separarlo en otra celda.
Espero que sea clara mi duda.
Saludos cordiales.
Me gustaMe gusta
Hola Juan Carlos:
En este post lo puedes hacer en word y es más sencillo para los formatos: https://excelsignum.com/2019/02/22/combinar-correspondencia-y-guardar-documentos-independientes/
Inténtalo así.
Me gustaMe gusta
Hola, yo necesito hacer eso, pero ya tengo la plantilla pdf, con formulario que se elaboro con wondershare pdf editor
Me gustaMe gusta
Hola Mario:
En este post tienes otro método: https://excelsignum.com/2019/02/22/combinar-correspondencia-y-guardar-documentos-independientes/
Me gustaMe gusta
Hola:
Mi caso es el siguiente. Tengo un documento de 1900 páginas que he generado combinando correspondencia. Ahora lo tengo que dividir en tantos documentos como nombres diferentes (76), hay en un campo del documento. Es decir, tengo que generar 76 documentos individuales nombrados con cada uno de los nombres del campo del documento y mandar cada uno de estos documentos a una dirección de correo electrónico con cinco palabras en el asunto del mensaje.
Me podrías dar alguna pista de cómo hacerlo?
Muchas gracias
Me gustaMe gusta
Hola,
Eres un gran experto, gracias a ti pude solucionar muchos problemas en el trabajo, pero ahora se suman los trabajos y tengo una duda, es posible también incluir ademas de texto imágenes en el generador y que las reemplace desde la base de datos.
Por otro lado también si es posible que al guardar en PDF ademas de independiente generase uno con todos juntos y ordenados.
Me gustaMe gusta
Hola Jose:
Este código es específico para generar archivos independientes. Para poder generar todos a la vez, debes utilizar COMBINAR CORRESPONDENCIA de WORD.
Por otra parte el tema de las imágenes para cada registro de la base de datos dudo que se puede realizar de forma sencilla (o que se puede realizar), dado que serían multitud de objetos a parametrizar y llevarlos a la hoja que se combina. Es decir, en el supuesto que sea una imagen por registro, sería necesario nombrar el objeto con un número para que se pudiese sincronizar con la fila asociada, identificarlo, seleccionarlo y pegarlo en la hoja nueva (y dimensionarlo).
Si son más imágenes, la complejidad sería aún mayor. Podrías intentarlo de la forma que te indico si solo trabajas con una imagen asociada a cada registro.
Saludos.
Me gustaMe gusta
Muchas gracias Segu,
Que pena, lo cierto que serian varias fotos, localizadas eso si, en la hoja de “base de datos” con el tamaño ya definido en esta, pero entiendo la complejidad, una foto no es un texto, es una pena deseaba crear un generador de informes que ademas de texto tuviera fotos y así ahorrarme el trabajo de crearlo de uno en uno.
¿Es posible hacerlo usando la función hipervínculo?, le doy vueltas al asunto, lo se, pero necesito algo de manera algo desesperada jejeje.
saludos, de nuevo gracias por tu ayuda.
Me gustaMe gusta
Hola José:
Si lo único que necesitas es pegar algunas imágenes a la hoja que se genera el PDF al estilo logo de la empresa, entonces sí es sencillo:
Lo único que tienes que hacer es eliminar esta parte del código en la macro ACTUALIZA
‘Eliminamos imagenes en la hoja Generar
‘For Each Shape In Sheets(“GENERAR”).Shapes
‘Shape.Delete
‘Next
De esa forma no se borrarán los shapes que hayas incluido en el modelo.
Saludos
Me gustaMe gusta
De nuevo muchas gracias Segu,
Pero no, lo que necesito es agregar 3 fotos por cada fila de datos, las fotos ya se encontrarían en la hoja de datos igual que el resto y con el tamaño que necesito para la hoja principal. Seria mover y reemplazar, por eso preguntaba si seria posible hacerlo de otra forma.
Saludos,
Me gustaMe gusta
Buenas,
Lo conseguí, después de muchas pruebas, logré que se pueda añadir fotos desde otra tabla con el formato de esta, añadiendo una macro de insertar y un numerador de fila, para que cuando aparezca determinado numero añada las fotos de esa fila con un corta y pega.
Me gustaLe gusta a 1 persona
Muy bien José.
Perfecto!.
Saludos
Me gustaMe gusta
Hola Segu, super este articulo, pero quisiera que no se exportaran los archivos a PDF, sino a archivos individuales de EXCEL, es posible?
Muchas Gracias
Me gustaMe gusta
Hola Segu, ya encontré la respuesta arriba, perdona… pero ahora necesito ampliar el rango de columnas por que de momento en la plantilla solo puedo usar la columna A, y me gustaría poder poner información en mas columnas.
Muchas gracias!!
Me gustaMe gusta
Creo que ya lo he solucionado!! Excelente blog!
Me gustaMe gusta
OK, Fernando.
Perfecto, saludos!!
Me gustaMe gusta
Muchas gracias por tu archivo ha sido de gran ayuda
Me gustaMe gusta
Gracias a ti, Cosme!
Saludos
Me gustaMe gusta