🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Save as PDF en Excel — ExportAsFixedFormat para hojas, rangos y libros

|

VBA Save as PDF en Excel — ExportAsFixedFormat para hojas, rangos y libros

TL;DR — En VBA no existe un «SaveAs PDF». Llamas a ExportAsFixedFormat sobre una hoja, un rango o un libro, le pasas Type:=xlTypePDF y una ruta completa que termine en .pdf, y Excel genera exactamente las páginas que imprimiría. Esa es toda la idea: un PDF es un trabajo de impresión enviado a un archivo. Así que el área de impresión, la orientación y el ajuste a página deciden qué acaba en el PDF — configura primero la página y exporta después.

Sub SaveReportAsPdf()
    Dim pdfPath As String
    pdfPath = ThisWorkbook.Path & "\Report_" & Format(Date, "yyyy-mm-dd") & ".pdf"
    ThisWorkbook.Worksheets("Report").ExportAsFixedFormat _
        Type:=xlTypePDF, Filename:=pdfPath, Quality:=xlQualityStandard, _
        IgnorePrintAreas:=False, OpenAfterPublish:=False
End Sub

La mayoría llega aquí después de probar SaveAs con un nombre .pdf, o después de grabar una macro de Archivo → Exportar y obtener una línea que no entiende. Esta guía abre una serie de tres artículos sobre cómo sacar resultados de Excel. Las tres piezas comparten una misma cadena. Page Setup decide qué es una página: su área de impresión, su orientación y su escala. PrintOut envía esas páginas a una impresora. ExportAsFixedFormat, que es lo que vemos aquí, envía esas mismas páginas a un archivo PDF. Deja bien la página una vez y las dos salidas salen bien; déjala mal y ninguna opción de exportación la va a rescatar.

Lo que aprenderás

  • Por qué un PDF generado desde Excel es un trabajo de impresión, y qué implica para tu código
  • La llamada a ExportAsFixedFormat y los argumentos que de verdad importan
  • Exportar una hoja, un rango o el libro entero
  • Reunir varias hojas elegidas en un solo PDF
  • Construir una ruta de archivo segura, y el error de ejecución 1004 que provoca una mala
  • El juicio a hacer: ExportAsFixedFormat frente a «imprimir a PDF»

El modelo mental: un PDF es una impresión enviada a un archivo

Excel no tiene un diseño aparte para PDF. Cuando exportas, pagina la hoja exactamente igual que lo haría para papel — misma área de impresión, mismos saltos de página, mismos márgenes, mismo encabezado y pie de página — y escribe esas páginas en un archivo en lugar de mandarlas a la cola de una impresora. Ese único hecho explica casi todas las preguntas del tipo «¿por qué mi PDF sale así?»:

  • El PDF parte una tabla ancha en dos páginas porque la página está en vertical al 100 % de escala.
  • El PDF incluye un bloque de celdas suelto muy por debajo de los datos porque el rango usado llega hasta ahí.
  • El PDF muestra solo parte de la hoja porque alguien definió un área de impresión hace meses y nunca la borró.

Ninguno de estos es un problema de exportación. Son problemas de página, y se corrigen en Page Setup, antes de que se ejecute la línea de exportación.

La llamada a ExportAsFixedFormat

ExportAsFixedFormat existe en Worksheet, Range, Workbook y Chart. Los argumentos que de verdad vas a usar:

Argumento Qué hace
Type xlTypePDF (o xlTypeXPS). Obligatorio.
Filename La ruta completa del archivo que se va a crear. Incluye la carpeta y .pdf.
Quality xlQualityStandard para calidad de impresión, xlQualityMinimum para un archivo más pequeño.
IgnorePrintAreas False (el valor predeterminado) respeta el área de impresión; True lo exporta todo.
From, To Un intervalo de páginas, por ejemplo de la 1 a la 3.
OpenAfterPublish True abre el PDF en el visor predeterminado al terminar.

Usa argumentos con nombre. La forma posicional funciona, pero ExportAsFixedFormat xlTypePDF, p, , , True es ilegible una semana después, y es fácil equivocarse con el orden.

Una hoja, un rango o el libro entero

El objeto sobre el que lo llamas decide el alcance:

' Una hoja (respeta el area de impresion de esa hoja)
Worksheets("Report").ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfPath

' Un rango, sin importar el area de impresion
Worksheets("Report").Range("A1:H40").ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfPath

' Todas las hojas visibles del libro, en el orden de las pestanas
ThisWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfPath

La forma de rango es la manera más rápida de entregar «solo este bloque» sin tocar el área de impresión de la hoja. La forma de libro deja fuera las hojas ocultas, que suele ser justo lo que quieres para hojas auxiliares y tablas de búsqueda.

Varias hojas elegidas en un solo PDF

Para combinar un conjunto concreto de hojas — por ejemplo un resumen y dos pestañas de detalle — selecciónalas como grupo y exporta la hoja activa. Una selección agrupada se exporta como un solo documento:

Sub ExportChosenSheets(pdfPath As String)
    ThisWorkbook.Worksheets(Array("Summary", "North", "South")).Select
    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfPath
    ThisWorkbook.Worksheets("Summary").Select      ' desagrupa de nuevo
End Sub

Este es uno de los pocos sitios donde Select hace falta de verdad; consulta Select y Activate para ver por qué lo evitas en todo lo demás. Desagrupa siempre después: un usuario que escribe en hojas agrupadas escribe en todas a la vez.

Para un PDF por hoja, recorre las hojas en un bucle y construye un nombre a partir de cada una:

Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
    If ws.Visible = xlSheetVisible Then
        ws.ExportAsFixedFormat Type:=xlTypePDF, _
            Filename:=ThisWorkbook.Path & "\" & ws.Name & ".pdf"
    End If
Next ws

Una ruta de archivo segura, y el error 1004 que evita

El fallo con el que tropieza todo el mundo es el error de ejecución 1004: Document not saved. The document may be open, or an error may have been encountered when saving. Casi nunca significa lo que parece. Las causas habituales:

  • La carpeta no existe — Excel no la va a crear. Créala antes con MkDir.
  • El PDF ya está abierto en un visor, que bloquea el archivo.
  • El nombre de archivo contiene un carácter que Windows prohíbe, como la / de una fecha o los : de una hora.
  • No hay nada que imprimir — la hoja o el área de impresión están vacías.

Un nombre de archivo sin carpeta no da error, y eso es peor: el PDF acaba en la carpeta actual de Excel (consulta CurDir) y el usuario nunca lo encuentra. Así que construye siempre la ruta completa y limpia las partes que vienen de los datos:

Function SafePdfPath(folder As String, baseName As String) As String
    Dim bad As Variant
    For Each bad In Array("/", "\", ":", "*", "?", """", "<", ">", "|")
        baseName = Replace(baseName, bad, "-")
    Next bad
    If Dir(folder, vbDirectory) = "" Then MkDir folder
    SafePdfPath = folder & "\" & baseName & ".pdf"
End Function

Si es el usuario quien debe elegir la ubicación, pregúntale con GetSaveAsFilename y pasa su resultado como Filename — y comprueba si devuelve False, que significa que canceló.

El juicio a hacer: exporta, no «imprimas a PDF»

Encontrarás código que cambia la impresora activa a Microsoft Print to PDF y llama a PrintOut con un nombre de archivo. No lo copies. Depende de un nombre de impresora que cambia según el equipo y el idioma, puede abrir un cuadro de diálogo Guardar que deja colgada una macro desatendida, y como efecto secundario cambia la impresora activa del usuario. ExportAsFixedFormat viene integrado en Excel, no necesita ninguna impresora y recibe la ruta como argumento. La regla es sencilla: el papel pasa por PrintOut; los archivos pasan por ExportAsFixedFormat. Y llames a lo que llames, la página que se genera se decidió en Page Setup — ahí es donde se arregla un PDF que sale mal.

Cómo te ayuda ExcelMaster

Las macros de PDF fallan de formas aburridas y muy concretas: una carpeta que todavía no existe, una fecha con barras en el nombre del archivo, un área de impresión que sobró del trimestre pasado, una tabla que se desborda a una segunda página. Todas aparecen como el mismo error 1004 que no ayuda nada, o como un PDF que sale sutilmente mal.

ExcelMaster te deja decir lo que quieres — «exporta el resumen y las dos pestañas de región a un solo PDF con el nombre de este mes, en horizontal, con una página de ancho» — y escribe a la vez la configuración de página, la ruta segura y la exportación, y luego comprueba el resultado. Te quedas con la macro y te ahorras las conjeturas.

Preguntas frecuentes

¿Cómo guardo una hoja de Excel como PDF con VBA?

Llama a ExportAsFixedFormat sobre la hoja con Type:=xlTypePDF y un Filename completo que termine en .pdf, por ejemplo Worksheets("Report").ExportAsFixedFormat Type:=xlTypePDF, Filename:="C:\Out\Report.pdf". SaveAs no tiene opción de PDF; el método de exportación es la vía admitida.

¿Cómo guardo solo un rango como PDF?

Llama al método sobre el propio rango: Range("A1:H40").ExportAsFixedFormat Type:=xlTypePDF, Filename:=pdfPath. Así se exporta ese bloque sin importar el área de impresión de la hoja, de modo que no tienes que cambiar el área de impresión y restaurarla alrededor de la exportación.

¿Cómo exporto varias hojas a un solo PDF?

Selecciona las hojas como grupo con Worksheets(Array("Summary", "North")).Select y luego llama a ActiveSheet.ExportAsFixedFormat. La selección agrupada se escribe como un solo documento. Después selecciona una sola hoja para desagrupar, así lo que se escriba luego no cae en todas las hojas.

¿Por qué ExportAsFixedFormat lanza el error de ejecución 1004?

Normalmente porque la carpeta de la ruta no existe, el PDF ya está abierto en un visor, el nombre de archivo contiene un carácter prohibido como / o :, o no hay nada que imprimir. Construye la ruta completa, crea antes la carpeta y quita los caracteres no válidos de cualquier parte que venga de los datos.

¿Por qué mi PDF parte la tabla en varias páginas o incluye celdas de más?

Porque el PDF usa la configuración de página de la hoja. Una tabla ancha en vertical al 100 % de escala se parte en varias páginas, y un rango usado que llega muy por debajo de los datos añade páginas en blanco. Corrígelo en PageSetup — orientación, área de impresión y ajuste a una página de ancho — antes de exportar.

Probado en

Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 29/09/2026.

Guías relacionadas: VBA PrintOut · VBA Page Setup · VBA GetSaveAsFilename · VBA MkDir · VBA CurDir · VBA Outlook · VBA On Error