Articolo wiki
  • Questo articolo wiki è bloccato
Applicabile a 134 visualizzazioni

Excel - Allineare i dati numerici nelle colonne di una ListBox - VBA

Livello tecnico : Base

Riepilogo

In questo breve articolo vediamo come allineare i dati numerici nelle colonne della Listbox. L'esempio è valido per tutte le versioni di Excel.

Dettagli

NOTA. Gli esempi ed il codice sono forniti *così come sono* e l’autore declina ogni responsabilità per un loro uso scorretto. Utilizzate gli esempi forniti o file di prova per i vostri test. La correzione delle eccezioni (errori) e il controllo del tipo di dati inserito è solo parziale. I file vogliono essere un semplice esempio che illustra come sia possibile automatizzare Excel e Word e sono forniti solo a scopo dimostrativo.

Premessa.

Come sappiamo, di default le Listbox non consentono di allineare ciascuna colonna come vorremmo. Ad esempio avendo una tabella come quella dell'esempio che vedete qui sotto, i dati verrebbero riportati nella Listbox in questo modo:

Non bello a vedersi, con i numeri non incolonnati e quindi poco comprensibili. Inoltre la formattazione non consente di vedere i decimali come vorremmo. Una soluzione potrebbe essere quella di ricorrere al controllo ListView, ma nelle versioni più recenti e a 64bit di Office la cosa porta a problemi di compatibilità.

Un modo per allineare i valori numerici e dare loro la giusta formattazione è quello di *truccare* il dato inserito via via nella colonna, aggiungendo spazi vuoti a sx dello stesso.

L'esempio scaricabile qui:

mostra come sia possibile allineare e formattare in modo corretto i dati numerici nella Listbox.

Ecco il risultato:

L'esempio è commentato riga per riga. Riporto qui il codice evidenziando in grassetto le parti *che fanno la differenza*.

Private Sub UserForm_Initialize()

    'dichiarazione variabili
    Dim sh As Worksheet
    Dim lRiga As Long
    Dim lCont As Long
    Dim lng As Long
    Dim lString As Long

    'la costante lMAX va implementata con un valore
    'che corrisponda ai massimi caratteri
    '(punti e virgole compresi) che si presumono
    'avere nella tabella; 13 corrisponde ad un massimo di
    '99.999.999,99;
    'se avete più di due decimali tenetene conto
    Const lMAX As Long = 13
   

    'metto un riferimento al foglio con la tabella
    Set sh = ThisWorkbook.Worksheets("Foglio1")
    'trovo l'ultima riga con dati nella tabella
    lRiga = sh.Range("A" & Rows.Count).End(xlUp).Row

   

       With Me.ListBox1
        'imposto a 0(zero) la variabile che identifica
        'la riga della ListBox che vado ad aggiungere;
        'ricordo che il primo item(record/riga)
        'della ListBox è 0
        lCont = 0
        'imposto il numero delle colonne della ListBox;
        'la prima colonna sarà in seguito la colonna 0
        .ColumnCount = 4
        'imposto un carattere non proporzionale
        '(a larghezza fissa) per avere un corretto
        'allineamento
        .Font = "Courier New"
        'ciclo la tabella del Foglio1
        For lng = 1 To lRiga
            'aggiungo un item(record/riga) alla ListBox
            .AddItem
            'nella prima colonna della ListBox(colonna 0) metto il valore
            'della cella della colonna A della tabella
            .List(lCont, 0) = sh.Range("A" & lng).Value
            'adesso sottraggo a 13(la mia costante)
            'il numero di caratteri del valore presente nella cella della
            'colonna B della tabella del Foglio1
            lString = lMAX - Len(Format(sh.Range("B" & lng).Value, "#,###.00"))
            'vado ad concatenare quegli spazi
            'con il valore presente nella cella della colonna B
            'della tabella e inserisco tutto nella seconda colonna
            '(colonna 1) della ListBox
            .List(lCont, 1) = String(lString, "  ") & Format(sh.Range("B" & lng).Value, "#,###.00")
            'adesso sottraggo a 13(la mia costante)
            'il numero di caratteri del valore presente nella cella della
            'colonna C della tabella del Foglio1
            lString = lMAX - Len(Format(sh.Range("C" & lng).Value, "#,###.00"))
            'vado ad concatenare quegli spazi
            'con il valore presente nella cella della colonna C
            'della tabella e inserisco tutto nella terza colonna
            '(colonna 2) della ListBox
            .List(lCont, 2) = String(lString, "  ") & Format(sh.Range("C" & lng).Value, "#,###.00")
            'inserisco il valore della colonna D nella quarta colonna (colonna 3)
            'della ListBox
            .List(lCont, 3) = sh.Range("D" & lng).Value
            'aumento di 1 il valore della variabile
            lCont = lCont + 1
        Next
    End With

    Set sh = Nothing
End Sub


In definitiva il *segreto* per un corretto allineamento sta nell'impostare un carattere non proporzionale come il Courier New (o comunque un carattere con i numeri che *occupino* lo stesso spazio) e nella costante (qui lMAX) che definisce il massimo spazio che occuperanno i nostri numeri. Credo che il codice commentato sia abbastanza chiaro per tutto il resto.

Conclusioni.

Buon lavoro. Ciao e alla prossima.


Commenti.

Sono graditi i tuoi commenti a questo articolo Wiki e, se lo ritieni interessante, per favore spunta la voce : E' stato utile all'inizio della pagina.

Grazie.

NOTA. Excel non dispone nativamente di procedure assolutamente sicure per impedire la visualizzazione e la modifica del codice vb e/o per la protezione dei fogli. E’ una cosa da tenere sempre presente quando si distribuiscono file con contenuti ritenuti delicati. Ricordate anche che è possibile lanciare il file di Excel senza che vengano eseguite le macro.


Risorse.


 Avvio Pulito di Windows
(courtesy of Microsoft MVP Franco Leuzzi)

Computer infettato da malware (courtesy of Microsoft MVP Vincenzo Di Russo)

Commenti (0)

avanzamento