TL;DR —
Worksheet.PageSetupdefine la página: qué contiene (PrintArea), hacia dónde mira (Orientation), cómo se escala (ZoomoFitToPagesWide/FitToPagesTall), sus márgenes, las filas de título que se repiten, y su encabezado y pie de página. Tanto PrintOut como Save as PDF generan estas páginas, así que aquí es donde se arreglan los problemas de diseño. La regla que hace tropezar a todo el mundo: el ajuste a página solo funciona después de poner.Zoom = False.
Sub SetUpReportPage()
With Worksheets("Report").PageSetup
.PrintArea = "$A$1:$H$60"
.Orientation = xlLandscape
.Zoom = False ' obligatorio, o las dos lineas siguientes se ignoran
.FitToPagesWide = 1
.FitToPagesTall = False ' tantas paginas de alto como necesiten los datos
.PrintTitleRows = "$1:$2"
End With
End Sub
Esta es la base de una serie de tres artículos sobre cómo sacar resultados de Excel. PageSetup, que es lo
que vemos aquí, decide qué es una página. PrintOut envía esas páginas a una
impresora, y ExportAsFixedFormat envía esas mismas páginas a un PDF. Los
comandos de salida ocupan una línea cada uno; el trabajo de verdad está en la página. Cuando una impresión o
un PDF sale mal, el arreglo casi siempre está aquí, no en el comando que lo produjo.
Lo que aprenderás
- Por qué la definición de página controla tanto el papel como el PDF
- Fijar y borrar el área de impresión, también a partir de un
Range - Orientación, tamaño del papel y centrado
- Escala:
Zoomfrente a ajustar a páginas, y la regla que los une - Repetir filas de título, y encabezados y pies de página con números de página
- Márgenes en pulgadas o en centímetros
- Acelerar la configuración de página con
PrintCommunication
El modelo mental: la página es el producto
Cuando Excel imprime o exporta, no imprime una tabla — corta la hoja en páginas y saca esas páginas.
PageSetup guarda todas las reglas de ese corte: el área que se incluye, el papel, la dirección, la escala,
los márgenes y lo que se repite en cada página. PrintOut y
ExportAsFixedFormat son solo dos destinos para el resultado. Así que piensa en la
configuración de página como el producto y en el comando de salida como la entrega. Una macro de informe que
fija la página de forma explícita produce el mismo resultado en cualquier equipo; una que depende de lo que
se quedó configurado la última vez, no.
El área de impresión
PrintArea es una cadena que contiene una dirección en estilo A1, no un Range. Para fijarla a partir
de un rango, pasa el Address del rango:
Dim ws As Worksheet
Set ws = Worksheets("Report")
ws.PageSetup.PrintArea = ws.Range("A1").CurrentRegion.Address ' el bloque de datos
ws.PageSetup.PrintArea = "" ' borrarla: imprimir todo
Fijarla a partir de CurrentRegion o de la última fila es la forma de que un informe imprima exactamente sus datos, tenga las filas que tenga este mes. Borrarla con una cadena vacía es igual de importante: un área de impresión que sobró de una ejecución anterior recorta en silencio el siguiente informe.
Orientación, tamaño del papel y centrado
With ws.PageSetup
.Orientation = xlLandscape ' o xlPortrait
.PaperSize = xlPaperA4 ' o xlPaperLetter
.CenterHorizontally = True
End With
PaperSize depende de lo que admita el controlador de la impresora; un tamaño que la impresora no tiene
provoca un error. Para un libro que va tanto a Europa como a Estados Unidos, fíjalo a propósito en lugar de
darlo por supuesto.
Escala: Zoom frente a ajustar a páginas
Hay dos formas de escalar, y son mutuamente excluyentes. Zoom es un porcentaje de 10 a 400.
FitToPagesWide y FitToPagesTall dejan que Excel elija la escala para encajar en un número de páginas.
Excel solo usa los ajustes de encaje cuando Zoom es False — mientras Zoom tenga un número, se
ignoran sin avisar. Por eso tantas macros de «ajustar a una página» no hacen nada:
With ws.PageSetup
.Zoom = False
.FitToPagesWide = 1 ' todas las columnas en una pagina de ancho
.FitToPagesTall = False ' las filas ocupan tantas paginas como haga falta
End With
FitToPagesWide = 1 con FitToPagesTall = False es lo que quieren la mayoría de los informes: no partir
nunca las columnas y dejar que las filas fluyan. Poner los dos a 1 lo aprieta todo en una sola página, lo
cual está bien para un resumen y resulta ilegible para una lista larga.
Filas de título, encabezados y pies de página
PrintTitleRows repite filas de encabezado en la parte superior de cada página; recibe una dirección de
filas como cadena. Los encabezados y pies de página reciben texto con códigos: &P es el número de página,
&N el total de páginas, &D la fecha y &A el nombre de la hoja.
With ws.PageSetup
.PrintTitleRows = "$1:$2"
.CenterFooter = "Page &P of &N"
.RightHeader = "&A - printed &D"
End With
Como & inicia un código, un ampersand literal en el texto de un encabezado tiene que ir duplicado:
"R&&D Report" se imprime como R&D Report.
Márgenes en pulgadas o en centímetros
Los márgenes se miden en puntos, no en pulgadas. Convierte con Application.InchesToPoints o
Application.CentimetersToPoints:
With ws.PageSetup
.LeftMargin = Application.CentimetersToPoints(1.5)
.RightMargin = Application.CentimetersToPoints(1.5)
.TopMargin = Application.InchesToPoints(0.75)
End With
Escribir .LeftMargin = 1 fija un margen de un punto — más o menos un tercio de milímetro —, que es una razón
habitual de que una impresión de repente llegue hasta el borde del papel.
Acelerar la configuración de página con PrintCommunication
Cada asignación de PageSetup habla con el controlador de la impresora, así que un bloque de diez ajustes
puede tardar segundos, y más aún en un bucle sobre muchas hojas. Corta esa conversación mientras configuras y
vuelve a activarla al terminar:
Application.PrintCommunication = False
With ws.PageSetup
.Orientation = xlLandscape
.Zoom = False
.FitToPagesWide = 1
.FitToPagesTall = False
End With
Application.PrintCommunication = True ' aplica los ajustes acumulados
Vuelve a activarla siempre — los ajustes solo se confirman cuando regresa a True. La misma lógica se aplica
a ScreenUpdating: impide que Excel haga trabajo que no necesitas mientras se
ejecuta la macro.
Cómo te ayuda ExcelMaster
La configuración de página es donde las macros de informes fallan en silencio: un Zoom que desactiva sin
avisar el ajuste a página, un margen puesto en puntos en lugar de centímetros, un área de impresión que sobró
del mes pasado, un pie de página con un ampersand que desaparece. Nada de esto da error — el informe
simplemente sale mal, en papel o en PDF.
ExcelMaster te deja describir la
página — «A4 en horizontal, una página de ancho, repetir las dos primeras filas, números de página en el pie»
— y escribe el bloque PageSetup completo con la regla del zoom, la conversión de unidades y el modo rápido
resueltos, y luego muestra una vista previa de las páginas para que veas el diseño antes de imprimir o
exportar nada.
Preguntas frecuentes
¿Cómo fijo el área de impresión en VBA?
Asigna una cadena con la dirección a PageSetup.PrintArea, por ejemplo Worksheets("Report").PageSetup.PrintArea = "$A$1:$H$60". Para usar un rango, pasa su Address: .PrintArea = Range("A1").CurrentRegion.Address.
Ponla a "" para borrar el área de impresión e imprimir la hoja entera.
¿Por qué no funciona FitToPagesWide?
Porque Zoom todavía tiene un porcentaje. Excel ignora FitToPagesWide y FitToPagesTall salvo que
PageSetup.Zoom = False. Pon primero Zoom a False y después los ajustes de encaje, normalmente
FitToPagesWide = 1 y FitToPagesTall = False.
¿Cómo pongo la orientación horizontal en VBA?
Usa Worksheets("Report").PageSetup.Orientation = xlLandscape. Usa xlPortrait para volver a vertical. El
ajuste se aplica tanto a la impresión como a la exportación a PDF, porque las dos generan la configuración de
página de la hoja.
¿Cómo repito las filas de encabezado en cada página impresa?
Asigna a PageSetup.PrintTitleRows una cadena con la dirección de las filas, por ejemplo "$1:$2" para
repetir las filas 1 y 2. Para repetir columnas a la izquierda de cada página, usa PrintTitleColumns con una
dirección de columnas como "$A:$A".
¿Por qué mi macro de PageSetup es tan lenta?
Cada propiedad de PageSetup habla con el controlador de la impresora. Envuelve los ajustes entre
Application.PrintCommunication = False y Application.PrintCommunication = True; así Excel los aplica en
un solo lote. Acuérdate de volver a ponerla a True, o los ajustes no se confirman.
Probado en
Probado en: Excel 365 (Windows 11), VBA 7.1 — última verificación el 29/09/2026.
Guías relacionadas: VBA Save as PDF · VBA PrintOut · VBA CurrentRegion · VBA Last Row · VBA Used Range · VBA ScreenUpdating · VBA Workbook BeforePrint
