Kirk preguntó si hay una forma de controlar condicionalmente lo que se imprime en Excel. Por ejemplo, la celda A1 contiene un valor y el valor controla exactamente lo que se imprime. Quizás si A1 contiene 1, se imprime la Hoja1; si contiene 2, se imprimen Sheet1 y Sheet2.

La única forma de hacer esto es con una macro, y hay varios enfoques que puede utilizar. Considere la siguiente macro muy simple, que simplemente usa una estructura Seleccionar caso para controlar la impresión.

Sub PrintStuff()

Dim vShts As Variant

vShts = Sheets(1).Range("A1")

If Not IsNumeric(vShts) Then         Exit Sub     Else         Select Case vShts             Case 1                 Sheets("Sheet1").PrintOut             Case 2                 Sheets("Sheet2").PrintOut             Case 3                 Sheets("Sheet1").PrintOut                 Sheets("Sheet2").PrintOut         End Select     End If End Sub

Ejecute esta macro con el valor 1, 2 o 3 en la celda A1 de la primera hoja, y la macro imprime diferentes cosas según el valor. Si el valor es 1, se imprime Sheet1; si es 2, se imprime la Hoja2; y si es 3, se imprimen tanto Sheet1 como Sheet2. Si desea que diferentes valores impriman diferentes cosas, simplemente modifique la estructura Seleccionar caso para reflejar los valores posibles y lo que debe imprimirse para cada valor.

También se puede crear un enfoque más integral. Considere agregar una «hoja de control» a su libro de trabajo. Esta hoja tendría el nombre de cada hoja de trabajo en el libro de trabajo listado en la primera columna. Si coloca un valor a la derecha del nombre de una hoja de trabajo, en la segunda columna, una macro imprimirá la hoja de trabajo correspondiente.

La siguiente macro se puede utilizar para crear la «hoja de control».

Sub CreateControlSheet()

Dim i as integer

On Error Resume Next   'Delete this sheet if it already exists     Sheets("Control Sheet").Delete     On Error GoTo 0

Sheets.Add   'Add the WhatToPrint Sheet     ActiveSheet.Name = "Control Sheet"



Range("A1").Select   'Label the columns     ActiveCell.FormulaR1C1 = "Sheet Name"



Range("B1").Select     ActiveCell.FormulaR1C1 = "Print?"



Cells.Select     Selection.Columns.AutoFit

For i = 1 To ActiveWorkbook.Sheets.Count         Cells(i + 1, 1).Value = Sheets(i).Name     Next End Sub

La macro primero elimina cualquier hoja de control anterior, si existe. Luego agrega una nueva hoja de trabajo llamada Hoja de control y coloca etiquetas de encabezado en las columnas A y B. Luego, enumera todas las hojas de trabajo en el libro de trabajo en la columna A.

Con la hoja de control creada, puede colocar una «X» o algún otro valor (como «Y» o 1) en la columna B junto a cada hoja de trabajo que desee imprimir. Luego, la siguiente macro examina la hoja de control e imprime cualquier hoja de trabajo que tenga una marca, cualquier marca, en la celda de la columna B.

Sub PrintSelectedSheets()

Dim i as Integer     i = 2

Do Until Sheets("Control Sheet").Cells(i, 1).Value = ""

If Trim(Sheets("Control Sheet").Cells(i, 2).Value <> "") Then             Sheets(Sheets("Control Sheet").Cells(i, 1).Value).Select             ActiveWindow.SelectedSheets.PrintOut Copies:=1         End If         i = i + 1     Loop End Sub

Otro método consiste en crear una macro que se ejecute justo antes de imprimir.

(La impresión es uno de los eventos que Excel le permite atrapar). La siguiente macro, agregada al objeto thisWorkbook, se ejecuta cada vez que intenta imprimir.

Private Sub Workbook_BeforePrint(Cancel As Boolean)

Dim vShts As Variant     Dim iResponse As Integer     Dim bPreview As Boolean

On Error GoTo ErrHandler

vShts = Sheets(1).Range("A1")

If Not IsNumeric(vShts) Then         GoTo InValidEntry     ElseIf vShts < 1 Or vShts > Sheets.Count Then         GoTo InValidEntry     Else         iResponse = MsgBox(prompt:="Do you want Print Preview?", _           Buttons:=vbYesNoCancel, Title:="Preview?")

Select Case iResponse             Case vbYes                 bPreview = True             Case vbNo                 bPreview = False             Case Else                Msgbox "Canceled at User request"

GoTo ExitHandler         End Select

Application.EnableEvents = False         Sheets(vShts).PrintOut Preview:=bPreview     End If

ExitHandler:

Application.EnableEvents = True     Cancel = True     Exit Sub

InValidEntry:

MsgBox "'" & Sheets(1).Name & "'!A1" _         & vbCrLf & "must have a number between " _         & "1 and " & Sheets.Count & vbCrLf     GoTo ExitHandler

ErrHandler:

MsgBox Err.Description     Resume ExitHandler End Sub

La macro verifica el valor en la celda A1 de la primera hoja de trabajo. Utiliza este valor para determinar qué hojas de trabajo se deben imprimir. En otras palabras, un 1 imprime la primera hoja de trabajo, un 2 imprime la segunda, un 3 imprime la tercera y así sucesivamente.

Si el valor en A1 no es un valor o si es menor que 1 o mayor que la cantidad de hojas de trabajo en el libro de trabajo, se informa al usuario que el valor es incorrecto y se sale de la macro.

Suponiendo que el valor en A1 está dentro del rango, la macro le pregunta si desea usar la Vista previa de impresión. Dependiendo de la respuesta del usuario, la macro imprime la hoja de trabajo especificada o muestra la Vista previa de impresión para esa hoja de trabajo.

_Nota: _

Si desea saber cómo usar las macros descritas en esta página (o en cualquier otra página de los sitios ExcelTips), he preparado una página especial que incluye información útil.

link: / excelribbon-ExcelTipsMacros [Haga clic aquí para abrir esa página especial en una nueva pestaña del navegador].

ExcelTips es su fuente de formación rentable en Microsoft Excel.

Este consejo (13108) se aplica a Microsoft Excel 2007, 2010, 2013, 2016, 2019 y Excel en Office 365. Puede encontrar una versión de este consejo para la interfaz de menú anterior de Excel aquí:

link: / excel-Conditional_Printing [Impresión condicional].