TL;DR — En VBA no existe un «SaveAs PDF». Llamas a
ExportAsFixedFormatsobre una hoja, un rango o un libro, le pasasType:=xlTypePDFy 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
ExportAsFixedFormaty 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:
ExportAsFixedFormatfrente 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
