Guardar Excel en PDF con el nombre de una celda (y un PDF por cliente)
Archivo, Guardar como, elegir PDF, escribir el nombre, elegir carpeta. Para un documento no pasa nada. Para cuarenta facturas, presupuestos o extractos, uno por cliente y cada uno con su nombre, es media mañana y alguno acaba con el nombre mal. Aquí tienes las dos macros que lo resuelven: una que guarda la hoja con el nombre de una celda y otra que saca un PDF por cliente de una sola tabla.
Cuéntanos tu procesoEn resumen: el método ExportAsFixedFormat de VBA guarda una hoja o un rango como PDF. Si el nombre del archivo se toma de una celda (por ejemplo, el número de factura), hay que limpiar antes los caracteres que Windows no admite en un nombre de archivo. Para sacar un PDF por cliente, la macro filtra la tabla cliente a cliente y exporta lo visible en cada vuelta.
Macro 1: guardar la hoja en PDF con el nombre de una celda
El caso típico: una plantilla de factura o presupuesto donde la celda B3 tiene el número o el nombre del cliente, y quieres que el PDF se llame así y vaya a una carpeta fija.
Option Explicit
' Quita los caracteres que Windows no admite en un nombre de archivo.
Function NombreLimpio(ByVal s As String) As String
Dim c As Variant
For Each c In Array("\", "/", ":", "*", "?", """", "<", ">", "|")
s = Replace(s, c, "-")
Next c
NombreLimpio = Trim$(s)
End Function
Sub GuardarPDF()
Dim carpeta As String, nombre As String
carpeta = ThisWorkbook.Path & "\PDF\"
If Dir(carpeta, vbDirectory) = "" Then MkDir carpeta
nombre = NombreLimpio(ActiveSheet.Range("B3").Value)
If nombre = "" Then
MsgBox "La celda B3 está vacía: no sé qué nombre ponerle al PDF."
Exit Sub
End If
ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=carpeta & nombre & ".pdf", Quality:=xlQualityStandard, _
IncludeDocProperties:=False, IgnorePrintAreas:=False, OpenAfterPublish:=False
End Sub
Tres detalles que marcan la diferencia con los ejemplos que circulan:
- Limpia el nombre. Una factura «2026/015» tiene una barra, y Windows no la acepta en un nombre de archivo: la macro falla con un error poco claro.
NombreLimpiola convierte en «2026-015». - Crea la carpeta si no existe, en lugar de fallar la primera vez.
- Respeta el área de impresión (
IgnorePrintAreas:=False). El PDF sale igual que si lo imprimieras, así que los márgenes, la orientación y el «ajustar a una página» se definen en Diseño de página, no en la macro.
Si en vez de la hoja entera quieres exportar solo un rango, cambia ActiveSheet por ActiveSheet.Range("A1:H40"). Y si lo que quieres es que el nombre combine varias celdas, por ejemplo «Factura 2026-015 Construcciones Pérez», basta con concatenarlas antes de limpiar.
Macro 2: un PDF por cliente a partir de una sola tabla
Este es el caso que de verdad ahorra horas: tienes una tabla con las líneas de todos los clientes (ventas, albaranes, horas, movimientos) y cada uno debe recibir un PDF solo con lo suyo.
La macro en marcha, grabada en Excel sin montaje. Filtra la tabla cliente a cliente y guarda un PDF con sus líneas, con el nombre del cliente en el archivo.
Los datos son inventados; la macro es real. Hay más ejemplos así en macros en vídeo.
' Hoja "Ventas": fila 1 = cabeceras, columna A = cliente, datos hasta la F.
Sub PDFPorCliente()
Dim ws As Worksheet, rng As Range, clientes As Object, c As Variant
Dim carpeta As String, ultima As Long, i As Long
Set ws = ThisWorkbook.Worksheets("Ventas")
ultima = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Set rng = ws.Range("A1:F" & ultima)
Set clientes = CreateObject("Scripting.Dictionary") ' lista sin repetidos
For i = 2 To ultima
If ws.Cells(i, "A").Value <> "" Then clientes(CStr(ws.Cells(i, "A").Value)) = True
Next i
carpeta = ThisWorkbook.Path & "\PDF por cliente\"
If Dir(carpeta, vbDirectory) = "" Then MkDir carpeta
Application.ScreenUpdating = False
For Each c In clientes.Keys
rng.AutoFilter Field:=1, Criteria1:=c
ws.ExportAsFixedFormat Type:=xlTypePDF, _
Filename:=carpeta & NombreLimpio(CStr(c)) & ".pdf"
Next c
ws.AutoFilterMode = False
Application.ScreenUpdating = True
End Sub
Funciona porque Excel no imprime las filas ocultas por un filtro: en cada vuelta, el PDF contiene las cabeceras y las líneas de un único cliente. El diccionario sirve para sacar la lista de clientes sin repetidos, sin tener que ordenarlos antes.
Errores habituales y cómo evitarlos
| Síntoma | Causa | Solución |
|---|---|---|
| Error 1004 al exportar | Carpeta inexistente, nombre con caracteres prohibidos o un PDF con ese nombre abierto en el visor | Crear la carpeta, limpiar el nombre y cerrar el PDF antes de volver a lanzar |
| «Ruta no encontrada» con el libro en OneDrive o SharePoint | ThisWorkbook.Path devuelve una dirección web (https://…), no una carpeta del disco | Usar una carpeta local fija o convertir la ruta de OneDrive a la carpeta sincronizada |
| El PDF sale en diez páginas diminutas | Configuración de página de la hoja | Ajustar en Diseño de página: orientación, área de impresión y «ajustar a 1 página de ancho» |
| Un cliente sale con las líneas de otro | El nombre del cliente está escrito de dos formas («Pérez SL» y «PEREZ S.L.») | Filtrar por código o NIF en lugar de por nombre |
| Se sobrescribe el PDF del mes anterior | Mismo nombre cada mes | Añadir la fecha al nombre: nombre & " " & Format(Date, "yyyy-mm") |
Y después del PDF, ¿qué?
Guardar el PDF casi nunca es el final. Lo normal es que luego haya que mandárselo a cada cliente, y eso también se automatiza: la misma macro puede generar el PDF y crear el correo con el adjunto en Outlook, como explicamos en enviar correos masivos desde Excel. Si el documento tiene mucho texto con formato (contratos, certificados, cartas), suele quedar mejor generarlo en Word a partir del Excel y exportarlo a PDF: lo contamos en generar Word desde Excel.
En Fusionik montamos el proceso completo sobre tus plantillas reales: el PDF con tu formato, el nombre que usáis en la oficina, la carpeta de cada cliente o de cada mes y, si quieres, el envío. Te lo enseñamos funcionando con datos de ejemplo antes de que haya factura.
Cada semana enseñamos una macro nueva funcionando en Instagram (@fusionik_). También en TikTok y LinkedIn.
Actualizado el 31 de octubre de 2026.
Preguntas frecuentes
Sí. En lugar de exportar la hoja, se exporta el rango: ActiveSheet.Range("A1:H40").ExportAsFixedFormat con los mismos parámetros. También puedes definir un área de impresión en la hoja y la macro la respetará.
Sí. Se seleccionan las hojas a la vez (Sheets(Array("Portada", "Detalle")).Select) y se exporta la selección con ActiveSheet.ExportAsFixedFormat: el resultado es un solo PDF con las hojas en orden.
ExportAsFixedFormat existe en Mac, pero las rutas usan otro formato y el sistema pide permiso para escribir en cada carpeta. Una macro pensada para Windows hay que adaptarla; si en tu empresa hay Macs, dínoslo desde el principio.
Entonces en vez de filtrar la tabla, la macro rellena la plantilla con los datos de cada cliente y la exporta. Es el mismo principio, con una vuelta por cliente, y permite logotipo, totales y pie personalizados.
¿Cuántos PDF sacas a mano cada mes?
Cuéntanos qué documentos generas y cómo los nombras. Te enseñamos la macro funcionando con datos de ejemplo antes de que decidas nada.
¿Prefieres escribirnos directamente? info@fusionik.com