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

VBA PrintOut en Excel — imprime hojas, rangos y copias desde una macro

|

VBA PrintOut en Excel — imprime hojas, rangos y copias desde una macro

TL;DR — PrintOut envía páginas a una impresora. Llámalo sobre una hoja, un rango, un grupo de hojas o un libro, y usa argumentos con nombre para lo que necesites: Copies, From/To, Preview, Collate. Imprime las páginas que define tu Page Setup, así que arregla antes la página. Mientras estás construyendo la macro, imprime con Preview:=True. Y si el destino es un archivo y no papel, no imprimas en absoluto — exporta a PDF.

Sub PrintInvoices()
    With ThisWorkbook.Worksheets("Invoice")
        .PageSetup.PrintArea = "$A$1:$G$45"
        .PrintOut Copies:=2, Collate:=True, Preview:=False
    End With
End Sub

Este es el extremo en papel de una serie de tres artículos sobre cómo sacar resultados de Excel. Page Setup decide qué es una página. PrintOut, que es lo que vemos aquí, envía esas páginas a una impresora. ExportAsFixedFormat envía esas mismas páginas a un archivo PDF. Como las dos salidas leen de una única definición de página, la mayoría de los problemas del tipo «mi impresión sale mal» son problemas de página, y se corrigen antes de que esta línea llegue a ejecutarse.

Lo que aprenderás

  • Qué imprime realmente PrintOut, y de dónde sale la página
  • Los argumentos que merece la pena conocer: copias, intervalos de páginas, vista previa, intercalar
  • Imprimir una hoja, un rango, varias hojas o un libro entero
  • Probar sin gastar papel
  • Elegir impresora con ActivePrinter y dejar después la anterior
  • El juicio a hacer: PrintOut para papel, exportar para archivos

El modelo mental: PrintOut imprime páginas, no celdas

PrintOut no sabe nada de tu tabla. Sabe de páginas: los rectángulos en los que Excel corta la hoja a partir del área de impresión, la orientación, la escala, los márgenes y los saltos de página. Envía esas páginas a la impresora, en orden. Así que cuando una columna acaba sola en la página 2, o sale una página en blanco al final, la causa es la definición de la página, no la llamada de impresión:

  • Una columna se desborda a una página nueva porque la hoja está en vertical al 100 % de escala.
  • Aparece una página en blanco porque una celda con formato muy por debajo de los datos estira el rango usado.
  • Falta la mitad del informe porque sigue definida un área de impresión antigua.

Ten presente ese reparto y lo demás es sencillo: Page Setup da forma a las páginas y PrintOut las entrega.

Los argumentos de PrintOut que importan

PrintOut admite hasta nueve argumentos. Estos son los que vas a usar:

Argumento Qué hace
From, To Primera y última página que se imprimen. Omítelos para imprimir todas.
Copies Número de copias.
Collate True imprime cada copia completa en orden (1-2-3, 1-2-3).
Preview True abre primero la vista previa de impresión en lugar de imprimir directamente.
ActivePrinter La impresora que se usa para este trabajo.
IgnorePrintAreas True imprime la hoja entera, sin tener en cuenta el área de impresión.

Escríbelos siempre como argumentos con nombre. .PrintOut 1, 2, 3 compila, pero nadie sabe cuál de los números es el de copias.

Una hoja, un rango, varias hojas o el libro

El objeto sobre el que llamas a PrintOut fija el alcance:

Worksheets("Report").PrintOut                       ' una hoja
Worksheets("Report").Range("A1:F30").PrintOut       ' un rango, sin tener en cuenta el area de impresion
Worksheets(Array("North", "South")).PrintOut        ' varias hojas, un solo trabajo
ThisWorkbook.PrintOut                               ' todas las hojas visibles

Imprimir un conjunto de hojas como un solo trabajo importa para la numeración de páginas y para las impresoras a doble cara: las hojas salen como un único documento, con números de página que continúan de una a otra si el pie de página usa &P. Para imprimir cada hoja por separado, recórrelas con For Each y llama a PrintOut dentro del bucle.

Probar sin gastar papel

Una macro de impresión en desarrollo es una trituradora de papel. Dos costumbres lo evitan:

Worksheets("Report").PrintOut Preview:=True    ' muestra la vista previa; el usuario decide
Worksheets("Report").PrintPreview              ' solo vista previa, nunca imprime por si sola

Preview:=True es el interruptor que cambias cuando la macro está terminada: el código sigue igual, solo cambia ese argumento. Mejor aún, comprueba el diseño exportando a PDF mientras trabajas — muestra exactamente las páginas que enviaría PrintOut, y no cuesta nada.

Elegir una impresora, y volver a dejar la anterior

Application.ActivePrinter es la impresora que usa Excel. Puedes cambiarla, pero el nombre tiene que coincidir exactamente, incluido el puerto que le asignó Windows — algo como "Label Printer on Ne02:" —, y ese puerto puede ser distinto de un equipo a otro. Cambiarla también cambia la impresora para todo lo que el usuario imprima después. Así que guarda el valor actual, cambia, imprime y restaura — aunque la impresión falle:

Sub PrintOnLabelPrinter()
    Dim oldPrinter As String
    oldPrinter = Application.ActivePrinter
    On Error GoTo Restore
    Application.ActivePrinter = "Label Printer on Ne02:"
    Worksheets("Labels").PrintOut
Restore:
    Application.ActivePrinter = oldPrinter
    If Err.Number <> 0 Then MsgBox "Could not print: " & Err.Description
End Sub

Para averiguar el nombre exacto, imprime una vez a mano en esa impresora y ejecuta Debug.Print Application.ActivePrinter en la ventana Inmediato.

El juicio a hacer: el papel por PrintOut, los archivos por exportación

PrintOut tiene los argumentos PrintToFile y PrToFileName, y encontrarás código que los combina con la impresora Microsoft Print to PDF para generar un PDF. Evítalo. Depende de un nombre de impresora que cambia según el equipo y el idioma de Windows, puede abrir un cuadro de diálogo Guardar que congela una macro desatendida, y cambia la impresora activa. ExportAsFixedFormat genera el mismo PDF sin impresora, sin cuadro de diálogo y sin efectos secundarios. La regla: PrintOut es para papel; un archivo es una exportación. Y elijas la salida que elijas, sus páginas salen de Page Setup — arréglalo ahí.

Cómo te ayuda ExcelMaster

Las macros de impresión fallan de maneras que solo ves en papel: la columna solitaria en la página 2, la página en blanco al final, la impresora equivocada, las veinte copias que tenían que ser dos. Cada una cuesta una reimpresión antes de que nadie mire el código.

ExcelMaster te deja describir el trabajo — «imprime dos veces la hoja de la factura, en horizontal, con una página de ancho, en la impresora de etiquetas» — y escribe a la vez la configuración de página y la llamada a PrintOut, guardando y restaurando la impresora. Lo ves en vista previa como PDF antes de que se mueva una sola hoja de papel.

Preguntas frecuentes

¿Cómo imprimo una hoja con VBA?

Llama a PrintOut sobre la hoja: Worksheets("Report").PrintOut. Añade argumentos con nombre para lo que necesites, como Copies:=2 o From:=1, To:=3. Imprime las páginas que define la configuración de página de la hoja, así que fija antes el área de impresión y la orientación si el diseño importa.

¿Cómo imprimo un rango concreto en VBA?

Llama a PrintOut sobre el rango: Range("A1:F30").PrintOut. Así se imprime solo ese rango, sea cual sea el área de impresión de la hoja. Para un rango que imprimes a menudo, fija PageSetup.PrintArea una vez e imprime la hoja.

¿Cómo muestro la vista previa de impresión antes de imprimir?

Pasa Preview:=True a PrintOut, que abre la vista previa de impresión y deja que el usuario imprima o cancele. Para mostrar la vista previa sin imprimir nada, llama a PrintPreview sobre la hoja. Usa la vista previa mientras desarrollas la macro para que las pruebas no gasten papel.

¿Cómo imprimo en una impresora concreta en VBA?

Asigna a Application.ActivePrinter el nombre exacto de la impresora, puerto incluido, como "Office Printer on Ne01:", y luego llama a PrintOut. Guarda antes el valor anterior y restáuralo después, porque la opción sigue vigente para todo lo que el usuario imprima a continuación.

¿Puedo usar PrintOut para generar un PDF?

Puedes, con la impresora Microsoft Print to PDF y PrToFileName, pero es frágil: los nombres de impresora cambian de un equipo a otro y un cuadro de diálogo Guardar puede dejar colgada la macro. Usa ExportAsFixedFormat Type:=xlTypePDF en su lugar — no necesita impresora y recibe la ruta del archivo como argumento.

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 Page Setup · VBA Used Range · VBA For Each · VBA Workbook BeforePrint · VBA Immediate Window · VBA On Error