none
Ordinamento per data di una listbox RRS feed

  • Domanda

  • Ho un form con all'interno una listbox,  (piccolo programma realizzato con excel office 97) che viene popolata tramite una file esterno. Il mio problema è ordinare la listbox per data.

    Per maggior chiarezza allego il seguente codice:

     Private Sub AggiornaLista()

    Dim Num, rec, Nconto, PerDeduc, NSPE As Integer, Percorso, NomiForni, DescSpesa, NumD As String, SIVA, SAltriCosti, ImpDeducibile, Totale, SCosto As Double
    Dim DataD, DATAP As Date, BS As Boolean
    Dim TotCosti, TotIVA, TotAlCosti, Complessivo, TotImpDed As Double
    Dim LISTA()
    Percorso = UserForm1.TextBox6
    Dim DatiGenerali As numclienti
    Dim CompNegativi As Spese

    Open Percorso & "DatiGenerali.dat" For Random As #1 Len = Len(DatiGenerali)
    Get #1, 1, DatiGenerali
    NSPE = CInt(DatiGenerali.NUMSPESE)
    Close #1

    If NSPE > 0 Then
    ReDim LISTA(NSPE - 1, 10)
    TotCosti = 0
    TotIVA = 0
    TotAlCosti = 0
    TotImpDed = 0

    '********************** Leggo i dati da un file esterno

    Open Percorso & "ComponentiNegativi.dat" For Random As #2 Len = Len(CompNegativi)

    For Num = 0 To NSPE - 1
    Get #2, Num + 1, CompNegativi
    rec = CInt(CompNegativi.RecSpesa)
    NumD = Trim(CompNegativi.NumDoc)
    DataD = CDate(CompNegativi.DataDoc)
    DATAP = CDate(CompNegativi.DataPag)
    BS = CBool(CompNegativi.BeneStrum)
    SCosto = CDbl(CompNegativi.Costo)
    SIVA = CDbl(CompNegativi.IVA)
    SAltriCosti = CDbl(CompNegativi.AltriCosti)
    Totale = SCosto + SIVA + SAltriCosti
    NomiForni = Trim(CompNegativi.NomFornitore)
    DescSpesa = Trim(CompNegativi.DescrCosto)
    Nconto = CInt(CompNegativi.NumConto)
    PerDeduc = CInt(CompNegativi.PercDeduc)

    ImpDeducibile = Totale * PerDeduc / 100

    '********************* Popolo la  listBox
    LISTA(Num, 0) = rec
    LISTA(Num, 1) = NumD
    LISTA(Num, 2) = DataD
    LISTA(Num, 3) = DATAP
    LISTA(Num, 4) = Format(SCosto, "€      #,##0.00")
    LISTA(Num, 5) = Format(SIVA, "€      #,##0.00")
    LISTA(Num, 6) = Format(SAltriCosti, "€      #,##0.00")
    LISTA(Num, 7) = Format(Totale, "€      #,##0.00")
    LISTA(Num, 8) = Format(PerDeduc, "#,##0")
    LISTA(Num, 9) = Nconto
    LISTA(Num, 10) = Format(ImpDeducibile, "€      #,##0.00")

    Next Num
    Close #2
    Me.ListBox6.LIST() = LISTA

    End If

    end sub 

     

    Vorrei ordinare i dati in ordine crescente con la variabile DataD (Data documento)

    Qualcuno mi può dare un spunto per creare una routine

    Grazie

    Giorgio

     

    lunedì 5 luglio 2010 15:51

Risposte

  • Ma perchè nel VBA di office 97 l'oggetto datagridview esiste?

    Grazie Bambolotto della risposta, ma potresti scrivermi un esempio di codice.


    Ciao Giorgio58,

    per eseguire il sort in VBA puoi partire da questo codice (che probabilmente dovrai adattare alle tue esigenze)

     

    Sub SortListBox(oLb As MSForms.ListBox, sCol As Integer, sType As Integer, sDir As Integer) 
      Dim vaItems As Variant 
      Dim i As Long, j As Long 
      Dim c As Integer 
      Dim vTemp As Variant 
       
       'Put the items in a variant array
      vaItems = oLb.List 
       
       'Sort the Array Alphabetically(1)
      If sType = 1 Then 
        For i = LBound(vaItems, 1) To UBound(vaItems, 1) - 1 
          For j = i + 1 To UBound(vaItems, 1) 
             'Sort Ascending (1)
            If sDir = 1 Then 
              If vaItems(i, sCol) > vaItems(j, sCol) Then 
                For c = 0 To oLb.ColumnCount - 1 'Allows sorting of multi-column ListBoxes
                  vTemp = vaItems(i, c) 
                  vaItems(i, c) = vaItems(j, c) 
                  vaItems(j, c) = vTemp 
                Next c 
              End If 
               
               'Sort Descending (2)
            ElseIf sDir = 2 Then 
              If vaItems(i, sCol) < vaItems(j, sCol) Then 
                For c = 0 To oLb.ColumnCount - 1 'Allows sorting of multi-column ListBoxes
                  vTemp = vaItems(i, c) 
                  vaItems(i, c) = vaItems(j, c) 
                  vaItems(j, c) = vTemp 
                Next c 
              End If 
            End If 
             
          Next j 
        Next i 
         'Sort the Array Numerically(2)
         '(Substitute CInt with another conversion type (CLng, CDec, etc.) depending on type of numbers in the column)
      ElseIf sType = 2 Then 
        For i = LBound(vaItems, 1) To UBound(vaItems, 1) - 1 
          For j = i + 1 To UBound(vaItems, 1) 
             'Sort Ascending (1)
            If sDir = 1 Then 
              If CInt(vaItems(i, sCol)) > CInt(vaItems(j, sCol)) Then 
                For c = 0 To oLb.ColumnCount - 1 'Allows sorting of multi-column ListBoxes
                  vTemp = vaItems(i, c) 
                  vaItems(i, c) = vaItems(j, c) 
                  vaItems(j, c) = vTemp 
                Next c 
              End If 
               
               'Sort Descending (2)
            ElseIf sDir = 2 Then 
              If CInt(vaItems(i, sCol)) < CInt(vaItems(j, sCol)) Then 
                For c = 0 To oLb.ColumnCount - 1 'Allows sorting of multi-column ListBoxes
                  vTemp = vaItems(i, c) 
                  vaItems(i, c) = vaItems(j, c) 
                  vaItems(j, c) = vTemp 
                Next c 
              End If 
            End If 
             
          Next j 
        Next i 
      End If 
       
       'Set the list to the array
      oLb.List = vaItems 
    End Sub

    da eseguirsi nel seguente modo :

    'Sort by the 1st column in the ListBox Alphabetically in Ascending Order
    SortListBox ListBox1, 0, 1, 1
     'Sort by the 1st column in the ListBox Alphabetically in Descending Order
    SortListBox ListBox1, 0, 1, 2
     'Sort by the 2nd column in the ListBox Numerically in Ascending Order
    SortListBox ListBox1, 1, 2, 1
     'Sort by the 2nd column in the ListBox Numerically in Descending Order
    SortListBox ListBox1, 1, 2, 2

    Ciao

    Renato Marzaro

     

    martedì 6 luglio 2010 07:53

Tutte le risposte

  • secondo me, è più pratico usare un datagridview invece di una listbox, comunque se proprio vuoi usare una listbox per scopi a me ignoti, io al tuo posto ordinerei le righe man mano che le inserisco nella listbox.

    Mi spiego meglio: (se vuoi ordinare per data documento)

    subito dopo la riga: LISTA(Num, 10) = Format(ImpDeducibile, "€      #,##0.00")

    inserisci un altro ciclo ricorsivo che cambia di posizione il record appena inserito con il precedente finchè la data del record precedente è più piccola o grande (a seconda dell'ordinamento che vuoi) della data del record attuale.

     

     

    lunedì 5 luglio 2010 16:29
  • Ma perchè nel VBA di office 97 l'oggetto datagridview esiste?

    Grazie Bambolotto della risposta, ma potresti scrivermi un esempio di codice.

    lunedì 5 luglio 2010 16:55
  • Ma perchè nel VBA di office 97 l'oggetto datagridview esiste?

    Grazie Bambolotto della risposta, ma potresti scrivermi un esempio di codice.


    Ciao Giorgio58,

    per eseguire il sort in VBA puoi partire da questo codice (che probabilmente dovrai adattare alle tue esigenze)

     

    Sub SortListBox(oLb As MSForms.ListBox, sCol As Integer, sType As Integer, sDir As Integer) 
      Dim vaItems As Variant 
      Dim i As Long, j As Long 
      Dim c As Integer 
      Dim vTemp As Variant 
       
       'Put the items in a variant array
      vaItems = oLb.List 
       
       'Sort the Array Alphabetically(1)
      If sType = 1 Then 
        For i = LBound(vaItems, 1) To UBound(vaItems, 1) - 1 
          For j = i + 1 To UBound(vaItems, 1) 
             'Sort Ascending (1)
            If sDir = 1 Then 
              If vaItems(i, sCol) > vaItems(j, sCol) Then 
                For c = 0 To oLb.ColumnCount - 1 'Allows sorting of multi-column ListBoxes
                  vTemp = vaItems(i, c) 
                  vaItems(i, c) = vaItems(j, c) 
                  vaItems(j, c) = vTemp 
                Next c 
              End If 
               
               'Sort Descending (2)
            ElseIf sDir = 2 Then 
              If vaItems(i, sCol) < vaItems(j, sCol) Then 
                For c = 0 To oLb.ColumnCount - 1 'Allows sorting of multi-column ListBoxes
                  vTemp = vaItems(i, c) 
                  vaItems(i, c) = vaItems(j, c) 
                  vaItems(j, c) = vTemp 
                Next c 
              End If 
            End If 
             
          Next j 
        Next i 
         'Sort the Array Numerically(2)
         '(Substitute CInt with another conversion type (CLng, CDec, etc.) depending on type of numbers in the column)
      ElseIf sType = 2 Then 
        For i = LBound(vaItems, 1) To UBound(vaItems, 1) - 1 
          For j = i + 1 To UBound(vaItems, 1) 
             'Sort Ascending (1)
            If sDir = 1 Then 
              If CInt(vaItems(i, sCol)) > CInt(vaItems(j, sCol)) Then 
                For c = 0 To oLb.ColumnCount - 1 'Allows sorting of multi-column ListBoxes
                  vTemp = vaItems(i, c) 
                  vaItems(i, c) = vaItems(j, c) 
                  vaItems(j, c) = vTemp 
                Next c 
              End If 
               
               'Sort Descending (2)
            ElseIf sDir = 2 Then 
              If CInt(vaItems(i, sCol)) < CInt(vaItems(j, sCol)) Then 
                For c = 0 To oLb.ColumnCount - 1 'Allows sorting of multi-column ListBoxes
                  vTemp = vaItems(i, c) 
                  vaItems(i, c) = vaItems(j, c) 
                  vaItems(j, c) = vTemp 
                Next c 
              End If 
            End If 
             
          Next j 
        Next i 
      End If 
       
       'Set the list to the array
      oLb.List = vaItems 
    End Sub

    da eseguirsi nel seguente modo :

    'Sort by the 1st column in the ListBox Alphabetically in Ascending Order
    SortListBox ListBox1, 0, 1, 1
     'Sort by the 1st column in the ListBox Alphabetically in Descending Order
    SortListBox ListBox1, 0, 1, 2
     'Sort by the 2nd column in the ListBox Numerically in Ascending Order
    SortListBox ListBox1, 1, 2, 1
     'Sort by the 2nd column in the ListBox Numerically in Descending Order
    SortListBox ListBox1, 1, 2, 2

    Ciao

    Renato Marzaro

     

    martedì 6 luglio 2010 07:53