Somma in Listbox



  • Somma in Listbox
    di Germano (utente non iscritto) data: 30/10/2012 14:47:08

    Buongiorno Luca,
    mi chiamo Germano e sto scopiazzanndo un pò di codice per effettuare un mio programmino, le chiedevo
    come posso ottenere la somma nella mia listBox di piu colonne (15) con la proprietà ColumnCount (che ne permette solo da 0 - 9)



  • di Vecchio Frac data: 30/10/2012 15:39:47

    Luca se ci sei... batti un colpo e interpretaci la domanda di Germano ^_^
    Scherzi a parte (non sono Luca... spero vada bene lo stesso), scopiazzare va bene ma bisogna sapere quel che si copia per adattarlo alle proprie esigenze.
    Cosa intendi per "ottenere la somma nella mia listBox di più colonne" ? cosa c'entra ColumnCount?
    In pratica: esponi il problema, dicci quel che sai fare, se hai fatto qualcosa e non sai andare avanti, magari allega un esempio di quel che ti serve.
    Aiutateci ad aiutarvi ^_^





  • di Germano data: 31/10/2012 01:09:20

    Ciao Vecchio Frac,
    scusa se ti rispondo in ritardo ma sono andato al lavoro.
    Di seguito inserisco il listato dal quale ho copiato.
    '------------------------------------------
    'evento eseguito alla creazione della UserForm
    Private Sub UserForm_Initialize()

    'dichiaro le variabili
    Dim col As Collection
    Dim c As Range
    Dim v As Variant
    Dim lUltRiga As Long

    'creo la Collection
    Set col = New Collection

    'metto un riferimento al workbook
    'che contiene il codice
    Set wk = ThisWorkbook
    'metto un riferimento al foglio
    'che contiene la tabella
    '(qui Foglio1)
    With wk
    Set sh = .Worksheets("Foglio1")
    End With
    'alcuni settaggi della ListBox
    With Me.ListBox1
    'larghezza ListBox
    .Width = 140
    'numero colonne ListBox
    .ColumnCount = 4
    'larghezza colonne ListBox
    .ColumnWidths = "50;25;25;25"
    End With

    With sh
    'trovo l'ultima riga con
    'un valore nella tabella
    'in Foglio1, colonna A
    lUltRiga = .Range("A" & _
    Rows.Count).End(xlUp).Row
    'metto un riferimento al Range
    Set rng = .Range("A2:A" & lUltRiga)
    End With

    'carico la Collection e la ComboBox
    'dei valori presenti in colonna A
    'in modo univoco
    On Error Resume Next
    For Each c In rng
    col.Add c.Value, CStr(c.Value)
    Next
    For Each v In col
    Me.ComboBox1.AddItem v
    Next

    'Set a Nothing delle variabili oggetto
    Set c = Nothing
    Set col = Nothing

    End Sub

    'al click sul pulsante carico nella
    'ListBox solo i dati della tabella
    'che in colonna A hanno quanto ho
    'inserito nella TextBox
    Private Sub CommandButton1_Click()
    'richiamo la sub che carica la ListBox
    'passando il valore di ricerca
    Call mCaricaListBox(Me.TextBox1.Text)
    End Sub

    Private Sub mCaricaListBox(ByVal sRicerca As String)

    'dichiaro le variabili
    Dim c As Range
    Dim lCont As Long
    Dim lng As Long
    Dim d1 As Double
    Dim d2 As Double
    Dim d3 As Double

    'valorizzo la variabile
    lCont = 0

    With Me.ListBox1
    'pulisto la ListBox
    .Clear
    'carico la ListBox
    For Each c In rng
    'se il valore della cella
    'è uguale a quello di ricerca
    If c.Value = sRicerca Then
    'aggiungo una riga alla
    'ListBox e le passo i
    'valori delle celle
    .AddItem
    .List(lCont, 0) = _
    c.Value
    .List(lCont, 1) = _
    c.Offset(0, 1).Value
    .List(lCont, 2) = _
    c.Offset(0, 2).Value
    .List(lCont, 3) = _
    c.Offset(0, 3).Value
    lCont = lCont + 1
    End If
    Next

    'eseguo le somme colonna per colonna
    For lng = 0 To Me.ListBox1.ListCount - 1
    d1 = d1 + Me.ListBox1.List(lng, 1)
    d2 = d2 + Me.ListBox1.List(lng, 2)
    d3 = d3 + Me.ListBox1.List(lng, 3)
    Next

    'aggiungo la riga con i separatori
    .AddItem
    .List(.ListCount - 1, 0) = ""
    .List(.ListCount - 1, 1) = "----"
    .List(.ListCount - 1, 2) = "----"
    .List(.ListCount - 1, 3) = "----"
    'aggiungo la riga con i totali
    .AddItem
    .List(.ListCount - 1, 0) = "Totale"
    .List(.ListCount - 1, 1) = d1
    .List(.ListCount - 1, 2) = d2
    .List(.ListCount - 1, 3) = d3

    End With

    'Set a Nothing delle variabili oggetto
    Set c = Nothing

    End Sub

    'evento click per caricare i dati
    'di un nominativo scelto nella ComboBox
    Private Sub ComboBox1_Change()
    'richiamo la sub che carica la ListBox
    'passando il valore di ricerca
    Call mCaricaListBox(Me.ComboBox1.Text)
    End Sub

    'pulsante che pulisce la ListBox
    Private Sub CommandButton2_Click()
    Me.ListBox1.Clear
    End Sub

    'evento eseguito alla distruzione della UserForm
    Private Sub UserForm_Terminate()
    'Set a Nothing delle variabili oggetto
    Set rng = Nothing
    Set sh = Nothing
    Set wk = Nothing
    End Sub

    Ciao Germano



  • di HarryBosch data: 31/10/2012 08:50:29

    Ciao Germano
    per capire bene, perché hai allegato il file, ma manca un passaggio:
    - vorresti portare le attuali quattro colonne della lista, a 15 colonne in visualizzazione, giusto? ovviamente con le relative somme?



  • di Germano data: 31/10/2012 11:25:15

    Si esatto



  • di HarryBosch data: 31/10/2012 12:03:45

    Che io sappia la versione Excel 2007 permette di caricare con
    .Additem fino a 9 colonne, altrimenti va in errore
    no so se nella verione 2010 è stato aumentato questo limite, o se non si tratta di un limite ma manca un'istruzione che ora mi sfugge.

    In ogni caso, se invece carichi la Listbox prendendo i riferimenti sul foglio non c'è limite al caricamento delle colonne, una cosa del tipo:
    ListBox1.List = Sheets("Foglio1").Range("A1:O20").Value

    Pertanto ho modificato una piccola parte del tuo codice, eliminado le aggiunte con .AddItem e ricopiando invece i dati della collection su un foglio di appoggio. Quindi recupero questi dati con l'istruzione sopra detta e carico la listbox.
    Vedi l'allegato "sommalistbox -1"



  • di Vecchio Frac data: 31/10/2012 14:25:54

    Il limite di nove colonne oltre la prima è tipico del controllo ListBox (e ComboBox) non associato.
    Per ovviare all'inconveniente basta associarlo ad una matrice (che sia da codice o che sia facendo riferimento ad un range nel foglio, credo sia indifferente).
    Non mi risulta che questo inconveniente sia fixato in Excel 2010 (ma sai com'è... it's a feature, not a bug e così ti fregano ^_^).





  • di germano (utente non iscritto) data: 31/10/2012 17:05:42

    Ciao HarryBosch
    e proprio quello che mi serviva

    Grazie

    a presto