Macro excel para convertir páginas en pdf, archivarlas en ubicación del PC y enviarlas por email.

Tengo una base de datos hecha en excel en la cual en la misma hoja aparecen unas 250 páginas con el nombre del cliente (siempre en la misma ubicación) y su dirección de email en otra celda (que también es siempre la misma). ¿Qué puedo hacer para que se imprima por separado cada separación de página (no de hoja) y me lo guarde en una ubicación del PC y a su vez, si fuese posible, enviarlas a traves de outlook en mensajes separados por cada pdf y cliente con su email correspondiente ya insertado en propia página del excel?. Trabajo con excel y outlook 2003.

1 Respuesta

Respuesta

Muchos años sin usar Excel 2003 pero, de lo que recuerdo, no hay forma de convertir en PDF como existe en versiones posteriores de Excel. Se puede usar alguna impresora virtual de PDF pero tienen ciertas limitaciones como el enviar, a través del mismo VBA, el nombre y ubicación del archivo PDF creado.

No tengo dicha versión de Excel instalada ya en ningún ordenador así que sería bueno que quizá nos comentes, como para comenzar, al menos sobre ese punto.

Abraham Valencia

Perdón me equivoqué al escribirlo . la versión que tengo de Office es la 2013 no la 2003.

Además tengo instalado Adobe Acrobat pro DC 2017.

Y yo asustado jajajja. Listo, mira, la cosa no es fácil pero tampoco es tan complicada. Sobre enviar mensajes con Outlook desde Excel y adjuntar archivos hay varios ejemplos, yo tengo alguna también (que te lo pasaré en un rato) pero sobre convertir cada página (no hoja como bien has aclarado) a PDF, no he visto mucho así que creo que podemos comenzar por ahí pero, previamente, algunas cosas que quedaron sin saberse:

- Son 250 paginas y asumo que es una por cliente ¿cierto? Entonces cada PDF debería llevar el nombre del cliente ¿es correcto?

- Mencionas que el nombre del cliente y su correo siempre están en ¿el mismo lugar? Así que asumo que te refieres a la misma columna ¿cierto? Ya que es una sola hoja no pueden ser las mismas filas pero en todo caso ¿qué columnas?

- El cliente y su correo ¿siempre son equidistantes del "salto de página"? Es decir, siempre están a "x" filas del "salto de página" inmediato superior

A la espera de más información entonces

Abraham Valencia

Es una página por cliente y cada pdf llevaría el nombre del cliente que ya lleva escrito en una fila en en encabezado y siempre estarían posicionados en la misma situación equidistante de cada salto de página tanto el nombre del cliente como la dirección de correo...

Si hubiese que poner el nombre del cliente y el email en una columna o celda (que fuese siempre la misma por cliente y página) me lo dices aunque supongo que el ancho de escritura podría ser mucho más limitado, aunque si es sólo en el aspecto visual y no afecta a la efectividad del proceso no importaría.

Gracias por tu ayuda

https://1drv.ms/x/s!ApkTgtnWCTgAi00B6fUeLP2caK31 

Lo primero es que configures los saltos de página para que los correos y nombres queden en la primera fila inmediata inferior de cada "salto de página":

Por más que yo lo haya dejado bien, como la configuración de las hojas/páginas depende de los drivers de la impresora, probablemente te aparezca distinto a como lo he dejado. También reemplaza por correos correctos, en el archivo los he eliminado (por privacidad).

El ejemplo convierte y guarda (en la misma carpeta del archivo/libro) cada página a PDF tomando como nombre la celda del "cliente". OJO, en tu archivo/libro si esa celda(s) tiene caracteres no permitidos para nombres de archivos, dará error. Tienes que, o revisar que los 250 no lo tengan, o añadir código que verifique eso (yo ya no me di tiempo para eso). Cada vez que la macro crea un archivo PDF usa el Outlook para "enviar" un mensaje al correo de la columna "G" con el respectivo adjunto. Ojo, en realidad cuando se usa el objeto "Outlook" y envíos masivos, lo que hace es ir poniendo los mensajes en la "Bandeja de salida" así que es recomendable que tengas tu Outlook configurado para el envío automático al abrir/cerrar para que el proceso continúe enviando así cierres el Excel. Igual si quieres que se haga al instante del envío desde la macro, puedes añadir un Application. Wait después del "Send" o tener el Outlook abierto.

Comentas

Abraham Valencia

Te adjunto el documento del que hablo. https://1drv.ms/x/s!AiQALqbGn-aacGI3K00u3NjfUJQ 

Las hojas ya están separadas. En cada una debe ir una tarifa con un nombre de cliente y su dirección de correo. Si no puede aparecer en la hoja porque se descompensen las columnas, mi pregunta es si se pueden ocultar las columnas que lo contengan.

Las dos primeras hojas no son tarifas para enviar, es sobre las que se va a trabajar para los distintos clientes. 

Una vez que se han enviado a la bandeja de salida se les puede poner asunto y firma o se enviarían sin nada. 

Gracias.

¿Viste el ejemplo que te envié? ¿Lo probaste?

Sobre el nombre y correo, yo los pongo en una columna aparte, tú puedes hacer lo mismo y claro que pueden estar ocultos, en realidad esos datos pueden estar donde tu quieras pero siempre equidistantes al "salto de página" pues así es como "capturo" esos datos:

'Esta línea ubica el número de fila del salto de página

Let Fila = Sheets("Hoja1").HPageBreaks(x - 1).Location.Offset(0, 0).Row

'Y estas dos líneas ubican el nombre y correo basadas en la anterior
Let NombreArchivo = Sheets("Hoja1").Range("F" & Fila).Value
Let Correo = Sheets("Hoja1").Range("G" & Fila).Value

'Esta línea nos da el número de páginas

Let NumerodePaginas = (Sheets("Hoja1").HPageBreaks.Count + 1) * (Sheets("Hoja1").VPageBreaks.Count + 1)

'Y en el "for" le decimos que vaya de la uno hasta esa última, si no quieres eso, cuestión de cambiar el inicio a algo así para que empiece, por ejemplo, de la página 3:

For x = 3 To NumerodePaginas

Si ves la parte del envío, hay un "Subject", que en castellano es "Asunto" y hay un "Body" (Cuerpo). En el cuerpo puedes poner lo que desees, incluso tu nombre. Si quieres que vaya tu firma que quizá tengas en *.jpg, hay que agregar más código pero yo te sugiero primero adaptar lo que te he enviado a tu necesidad y sobre todo entender que hace cada línea y ya después ver lo de la firma.

Prueba lo que te he enviado

Salu2

Abraham Valencia

He adaptado la macro a mi tarifa y me funciona correctamente.

Ahora tengo una duda. En el Outlook tengo varias cuentas y quiero enviarlo desde una cuenta determinada de gmail (que tengo añadida al outlook). Siempre será la misma cuenta para todos los envíos. 

También quiero añadir una firma con una imagen. 

Un saludo! 

Para enviar desde una de las cuentas que no sea la predeterminada, la solución más optima, de las que conozco, es usar una UDF. Mira por aquí:

https://ayudaexcel.com/foro/topic/32737-elegir-cuenta-de-correo-de-outlook/ 

Para colocar tu firma-Imagen, hay que adjuntarla (antes del PDF) y ya no usar "Body", sino "HTMLBody". Agregas una línea para la firma:

.Attachments.Add ThisWorkbook.Path & "\MiFirma.jpg"

Y ya no uses el "body", usa algo así:

.HTMLBody = "<html>" & _
                    "<body>" & _
                    "<p>Aqui tu mensaje</p>" & _
                    "<br>" & _
                    "<br>" & _
                   "<img src='cid:'" & .Attachments.Item(1).Filename & "'' height=100 width=75>" & _
                   "</body>" & _
                   "</html>"

Abraham Valencia

Me funciona todo correcto. He puesto la firma en jpg. Y además he elegido la cuenta desde la que quiero que se manden los emails.

Ahora me sale un error a la hora de enviar. Tengo el email del cliente puesto en la columna B. He intentado mandar la página 1 y la página 3 (a los distintos clientes) dejando sin enviar la página 2 quitando la dirección de correo, pero me da error y solo envía la uno. Me dice que Outlook no ha detectado algunas direcciones y solo envía hasta donde esta la casilla de email en blanco.

¿Hay alguna manera de poder arreglar esto?

Saludos!

El ciclo del "FOR" está programado para enviar cada página, tal cual mencionaste, para evitar enviar alguna debes colocar un "IF", algo así:

If Correo <> "" then

'aquí  todo lo que se hace

end if

'aquí sigue el "FOR"

Abraham Valencia

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas