Cominciamo con Excel.
La seguente routinetta torna utile quando si desidera applicare le tipiche “zebrature” dei moduli cosiddetti a lettura facilitata, ossia caratterizzati dall’alternanza di righe grigie e bianche:
Sub Zebratura(Zona As Range, IndColore)
Dim Riga As Range, sw As Boolean
For Each Riga In Zona.Rows
sw = Not sw 'Inverti lo sw da False a True e da True a False
If sw Then
Riga.Interior.ColorIndex = IndColore
Else
Riga.Interior.ColorIndex = xlColorIndexNone
End If
Next
End Sub
Tale Sub è dotata di due argomenti, con il secondo che permette di indicare un colore a scelta, magari diverso dal grigio. Si noti solo l’eleganza della soluzione, derivante dal commutatore booleano sw che l’istruzione sw = not sw rende alternativamente True e False, permettendo così di altalenare lo sfondo delle righe (interior) nel modo voluto.
Una routine di prova può subito esser cotta e mangiata, previa selezione di un intervallo di celle a piacere:
Sub ProvaZebratura()
Zebratura Selection, 15 '15 è l’indice del colore grigio
End Sub
Tabella zebrata in Word
La macro seguente fissa il colore grigio nelle sole righe dispari della tabella precedente (per semplicità supposta l’unica del documento Word attivo):
Sub ZebraTabella()
Dim TabZebr As Table, Riga As Row, sw As Boolean
Set TabZebr = ActiveDocument.Tables(1)
For Each Riga In TabZebr.Rows
sw = Not sw
ColoreSfondo = IIf(sw, wdColorGray25, wdColorAutomatic)
Riga.Cells.Shading.BackgroundPatternColor = ColoreSfondo
Next
End Sub
L’operazione avviene “a distanza”, ossia qualunque sia la posizione corrente del cursore. Si noti la buona analogia, mutatis mutandis, con l’esempio Excel, tranne la variante che adotta la funzione IIf.
Volendo si può rendere ZebraTabella una Sub dotata di argomenti come nell’esempio Excel. È un invito rivolto a volonterosi & interessati.
Osservazione finale. In luogo dei cicli For Each. . . Next si potevano ovviamente adottare dei For i = ... Next. Ossia, con riferimento all'ultima Sub:
For i = 1 To TabZebr.Rows.Count Step 2
TabZebr.Rows(i).Cells.Shading.BackgroundPatternColor = wdColorGray25
Next
Ma, per sicurezza, dovrebbe essere aggiunto l'analogo loop che impone il colore automatico alle righe pari. Insomma le routine proposte restano più compatte. Ed eleganti.
ULTIM'ORA
Zebratura col formato condizionale (Excel)
Un visitatore (tal Pierluigi) mi fa, giustamente, notare che “Il modo più semplice senza ricorre a molta programmazione è applicare la formattazione condizionale per la parte interessata con la formula è =RESTO(RIF.RIGA();2)=0 Selezionare poi il formato-> motivo che si desidera applicabile da tutti gli utenti anche quelli che non masticano Visual Basic application.”.
Giusto e complimenti vivissimi, non ci avevo pensato. E tuttavia: a) io qui mi occupo quasi solo di macro; b) gli utenti normali non masticano né il VBA né comandi così sofisticati (e poi tale comando non è supportato da Excel 97); c) solo con la mia macro si può “zebrare” una tabella Word.
Per puro sfizio ho poi pensato di tradurre in macro tali comandi. Ed ecco la macro che ha registrato quello di tipo “zebrante” :
Sub Macro1()
'
Selection.FormatConditions.Delete
Selection.FormatConditions.Add Type:=xlCellValue, Operator:=xlEqual, _
Formula1:="=RESTO(RIF.RIGA();2)=0"
Selection.FormatConditions(1).Interior.ColorIndex = 48
End Sub
Ho così scoperto la proprietà (anzi, la collection) FormatConditions, che ignoravo. Ed ecco la macro con argomenti che ho pensato di ricavarne, seguita da una routine di prova:
Sub Zebratura(Zona As Range, ColorSfondo)
With Zona.FormatConditions
.Delete
.Add Type:=xlCellValue, Operator:=xlEqual, Formula1:="=RESTO(RIF.RIGA();2)=0"
.Item(1).Interior.ColorIndex = ColorSfondo
End With
End Sub
Sub ProvaZebr()
Zebratura Range("C1:F10"), 48
End Sub
Invece con Validation, proprietà/oggetto che conoscevo già (ne ho dato un esempio d’uso in un'altra parte del mio blog), le cose NON sono andate a buon fine:
Sub Zebra()
With Range("C1:F10")
With .Validation
.Delete
.Add Type:=xlCellValue, Operator:=xlEqual, _
Formula1:="=MOD(ROW(),2)=0"
End With
.FormatConditions.Item(1).Interior.ColorIndex = 48 'dà errore!
End With
End Sub
L’ultima istruzione, dio sa perché, dà errore. D’altronde l’ho dovuta mettere lì e invocare FormatConditions perché – sempre dio sa perché – l’oggetto Validation NON è dotato della proprietà Interior. Qualcuno è in grado di darmi lumi?
?>
?>