Il blog di Gianni Giaccaglini

Blog su VBA e VSTO
Gianni Giaccaglini

My Links

News

NB - V. anche gli ARTICOLI (in fondo a questa barra)
Solo quesiti validi a: giannigiac@tin.it
Il mio nuovo libro


La mia nipotina ELISA

Foto con dedica a ME di
Bill Gates giovanissimo
nei mitici anni 80!

Categorie Post

Categorie Articoli

Archivio

Immagini

Blog Stats

Zebratura di un intervallo Excel o di una tabella Word (lettura facilitata)

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?

?>

?>

posted on martedì 10 gennaio 2006 17.52