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 proceso

En 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. NombreLimpio la 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íntomaCausaSolución
Error 1004 al exportarCarpeta inexistente, nombre con caracteres prohibidos o un PDF con ese nombre abierto en el visorCrear la carpeta, limpiar el nombre y cerrar el PDF antes de volver a lanzar
«Ruta no encontrada» con el libro en OneDrive o SharePointThisWorkbook.Path devuelve una dirección web (https://…), no una carpeta del discoUsar una carpeta local fija o convertir la ruta de OneDrive a la carpeta sincronizada
El PDF sale en diez páginas diminutasConfiguración de página de la hojaAjustar 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 otroEl 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 anteriorMismo nombre cada mesAñ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.

FAQ

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