Claudio ha chiesto se esiste un modo per controllare in modo condizionale ciò che viene stampato in Excel. Ad esempio, la cella A1 contiene un valore e il valore controlla esattamente ciò che viene stampato. Ad esempio, se A1 contiene 1, viene stampato Foglio1; se contiene 2, vengono stampati Foglio1 e Foglio2.
L’unico modo per farlo è utilizzare una macro ed è possibile utilizzare diversi approcci. Considera la seguente macro molto semplice, che utilizza semplicemente una struttura Select Case per controllare la stampa.
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("Foglio1").PrintOut
Case 2
Sheets("Foglio2").PrintOut
Case 3
Sheets("Foglio1").PrintOut
Sheets("Foglio2").PrintOut
End Select
End If
End Sub
Esegui questa macro con il valore 1, 2 o 3 nella cella A1 del primo foglio e la macro stamperà cose diverse in base al valore. Se il valore è 1, viene stampato Foglio1; se è 2 viene stampato il Foglio2; e se è 3, vengono stampati sia Foglio1 che Foglio2. Se desideri che valori diversi stampino cose diverse, modifica semplicemente la struttura Select Case per riflettere i valori possibili e cosa dovrebbe essere stampato per ciascun valore.
È anche possibile creare un approccio più completo. Considera l’idea di aggiungere un “foglio di controllo” alla tua cartella di lavoro. Questo foglio avrà il nome di ciascun foglio di lavoro nella cartella di lavoro elencato nella prima colonna. Se inserisci un valore a destra del nome del foglio di lavoro, nella seconda colonna, una macro stamperà il foglio di lavoro corrispondente.
La seguente macro può essere utilizzata per creare il “foglio di controllo”.
Sub CreateControlSheet()
Dim i as integer
On Error Resume Next 'Elimina questo foglio se esiste già
Sheets("Foglio di controllo").Delete
On Error GoTo 0
Sheets.Add 'Aggiunge il foglio di controllo
ActiveSheet.Name = "Foglio di controllo"
Range("A1").Select 'Etichetta le colonne
ActiveCell.FormulaR1C1 = "Nome Foglio"
Range("B1").Select
ActiveCell.FormulaR1C1 = "Stampare?"
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 elimina prima qualsiasi vecchio foglio di controllo, se esistente. Quindi aggiunge un nuovo foglio di lavoro denominato “Foglio di controllo” e inserisce le etichette delle intestazioni nelle colonne A e B. Elenca quindi tutti i fogli di lavoro nella cartella di lavoro nella colonna A.
Una volta creato il foglio di controllo, puoi inserire una “X” o un altro valore (come “S” o 1) nella colonna B accanto a ciascun foglio di lavoro che desideri stampare. La macro seguente esamina quindi il foglio di controllo e stampa qualsiasi foglio di lavoro che presenta un segno (qualsiasi segno) nella cella della colonna B.
Sub PrintSelectedSheets()
Dim i as Integer
i = 2
Do Until Sheets("Foglio di controllo").Cells(i, 1).Value = ""
If Trim(Sheets("Foglio di controllo").Cells(i, 2).Value <> "") Then
Sheets(Sheets("Foglio di controllo").Cells(i, 1).Value).Select
ActiveWindow.SelectedSheets.PrintOut Copies:=1
End If
i = i + 1
Loop
End Sub
Un altro approccio consiste nel creare una macro da eseguire immediatamente prima della stampa (la stampa è uno degli eventi che Excel consente di intercettare). La seguente macro, aggiunta all’oggetto Questa_cartella_di_lavoro, viene eseguita ogni volta che si tenta di stampare.
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:="Vuoi l'Anteprima di stampa?", _
Buttons:=vbYesNoCancel, Title:="Anteprima?")
Select Case iResponse
Case vbYes
bPreview = True
Case vbNo
bPreview = False
Case Else
Msgbox "Annullato su richiesta dell'utente"
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 & "deve avere un numero tra " _
& "1 e " & Sheets.Count & vbCrLf
GoTo ExitHandler
ErrHandler:
MsgBox Err.Description
Resume ExitHandler
End Sub
La macro controlla il valore nella cella A1 del primo foglio di lavoro. Utilizza questo valore per determinare quali fogli di lavoro devono essere stampati. In altre parole, a 1 stampa il primo foglio di lavoro, a 2 stampa il secondo, a 3 stampa il terzo e così via.
Se il valore in A1 non è un valore o se è inferiore a 1 o maggiore del numero di fogli di lavoro nella cartella di lavoro, l’utente viene informato che il valore non è corretto e la macro viene chiusa.
Supponendo che il valore in A1 rientri nell’intervallo, la macro chiede se si desidera utilizzare l’anteprima di stampa. A seconda della risposta dell’utente, la macro stampa il foglio di lavoro specificato o visualizza l’anteprima di stampa per quel foglio di lavoro.