maurogsc.eu
mauro gamberini


home ==> Excel: come fare per ==> ListBox: allineare le colonne in modo differente - VBA

ListBox: allineare le colonne in modo differente - VBA

NOTA. La soluzione ed il codice sono forniti *così come sono* e l’autore declina ogni responsabilità per eventuali problemi causati dal codice o dalla soluzione proposta se usati impropriamente. Create e utilizzate una copia del file per le vostre prove, *prima* di utilizzare il codice o la soluzione in files importanti.

1 - Abbiamo sul Foglio1 una tabella con tre colonne che vogliamo caricare in una ListBox sulla UserForm1. Ecco la tabella:

2 - Se carichiamo i dati nella ListBox con questo codice:

Private Sub UserForm_Initialize()

    Dim sh As Worksheet
    Dim lRiga As Long
    Dim lCont As Long
    Dim lng As Long

    Set sh = ThisWorkbook.Worksheets("Foglio1")
    lRiga = sh.Range("A" & Rows.Count).End(xlUp).Row

    With Me.ListBox1
        lCont = 0
        .ColumnCount = 3
        For lng = 2 To lRiga
            .AddItem
            .List(lCont, 0) = sh.Range("A" & lng).Value
            .List(lCont, 1) = sh.Range("B" & lng).Value
            .List(lCont, 2) = sh.Range("C" & lng).Value
            lCont = lCont + 1
        Next
    End With

    Set sh = Nothing

End Sub

Ecco cosa otteniamo lanciando la UserForm, tre colonne allineate a sinistra. I valori numerici della colonna 2 non sono allineati correttamente:

Se utilizzassimo la proprietà TextAlign della ListBox, potremmo allineare tutte le colonne a destra, ma a questo punto sarebbe il testo ad avere un allineamento sbagliato. Purtroppo la proprietà TextAlign non consente di allineare le singole colonne in modo differente.

3 - Il codice qui sotto(commentato):

Private Sub UserForm_Initialize()
    
    'dichiaro le variabili
    Dim sh As Worksheet
    Dim lRiga As Long
    Dim lCont As Long
    Dim lng As Long
    Dim lString As Long
    Const lMAX As Long = 10
    
    '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;
        'ricordo che il primo item(record/riga)
        'della ListBox è 0
        lCont = 0
        'imposto il numero delle colonne della ListBox;
        'la prima colonna sarà poi la colonna 0
        .ColumnCount = 3
        'imposto un carattere non proporzionale
        '(a larghezza fissa) per avere un corretto
        'allineamento
        .Font = "Courier New"
        'ciclo la tabella
        For lng = 2 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 10(la mia costante)
            'il numero di caratteri del valore presente nella cella della
            'colonna B della tabella
            lString = lMAX - Len(sh.Range("B" & lng).Value)
            'vado ad concatenare quegli spazi
            'con il valore presente nella cella della colonna A
            'della tabella e inserisco tutto nella seconda colonna
            '(colonna 1) della ListBox
            .List(lCont, 1) = String(lString, "  ") & sh.Range("B" & lng).Value
            'nella terza colonna della ListBox(colonna 2) metto il valore
            'della cella della colonna C della tabella
            .List(lCont, 2) = sh.Range("C" & lng).Value
            'aumento di 1 il valore della variabile
            lCont = lCont + 1
        Next
    End With
    
    'Set a Nothing della variabile oggetto
    Set sh = Nothing

End Sub

Da come risultato:

4 - In pratica aggiungo n spazi davanti al valore numerico contenuto nella cella. Il numero di spazi necessari, lo ottengo sottraendo alla mia costante(nell'esempio 10) la lunghezza(intesa come numero di caratteri) del valore contenuto nella cella della tabella. E' obbligatorio utilizzare un carattere non proporzionale(a larghezza fissa, tipo Courier New) per ottenere il corretto allineamento.

 

Per ulteriori informazioni su Microsoft Excel ed il suo Visual Basic, utilizzate questo forum:
http://social.answers.microsoft.com/Forums/it-IT/officeexcelit/threads


Ultimo aggiornamento di questa pagina: 12/01/2011 - mauro gamberini