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
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!
- Compartir respuesta
Buenas tardes Abraham. Perdona que te moleste. Me ayudaste mucho hace dos o tres años a diseñar una macro y que me funciona perfectamente hasta hoy, solamente por un pequeño detalle y es que la firma de Outlook en formato imagen PNG que antes me funcionaba, no sé porque motivo ahora no va y digo que no va, por que la coloca como dato adjunto en vez de al pie del mensaje. Te envio la formula completa más adelante para que veas donde puede estar el error. Insisto que el resto funciona correctamente. Los correos los manda bien, pero necesito que la imagen se vea al pie del mensaje correctamente. Como te digo, te copio y pego la fórmula completa de la macro, para ver si me puedes echar una mano - Sara Maeso
Mejor te voy a mandar, porque la formula es muy extensa, dónde verdaderamente estamos poniendo la imagen para ver si tenemos que cambiar la fórmula en ese apartado, para que ponga la firma en la parte de abajo del mail y no como archivo adjunto - Sara Maeso
Set Outlookapp = New Outlook.ApplicationSet MItem = Outlookapp.CreateItem(olMailItem)With MItem.SendUsingAccount = Outlookapp.Session.Accounts.Item(5).To = Correo.Subject = "Precios Atún Seakings.".BodyFormat = olFormatHTML.Attachments.Add "D:\Seakings.png".HTMLBody = "<html>" & _ "<body>" & _ "<p>Estimado cliente,<p>" & _ "<br>Adjunto le remitimos precios actualizados de nuestras referencias de Atún.</p>" & _ - Sara Maeso