Riepilogo Vba



  • Riepilogo Vba
    di isy data: 02/12/2014 21:52:20

    Chiedo consigli per impostare un ciclo

    Utilizzando codice vba devo filtrare un elenco di voci
    Devo riassumere le voci comuni e sommare i valori
    Allego file con i dati da filtrare: Riepilogo.xlsx



  • di lepat (utente non iscritto) data: 03/12/2014 08:04:25

    nel tuo esempi A21 è ripetuto 3 volte, percché ?



  • di lepat (utente non iscritto) data: 03/12/2014 08:15:40

    ti allego un file di esempio da cui puoi trarre spunti per risolvere



  • di isy (utente non iscritto) data: 03/12/2014 22:12:14

    Per Lepat
    Cit: nel tuo esempi A21 è ripetuto 3 volte, perché ?

    Devo raggruppare le voci per elencare la sequenza degli articoli movimentati.
    Ho trovato i riferimenti vba per completare la ricerca
     
    Option Explicit
    
    Sub Aggiorna_lista()
    
      Dim LastRow As Long
      Const Voce As String = "B"
      Const Num As String = "C"
      Const StartRow As Long = 5
      LastRow = Cells(Rows.Count, Voce).End(3).Row
      If StartRow > LastRow Then Exit Sub
      
      Dim I As Long
      Dim K As Long
      Dim Somma As Long
      Dim Articolo As String
      With ActiveSheet.ListBox1
        .ListFillRange = ""
        .Clear
        .ColumnCount = 2
        .ColumnWidths = "120;12"
        .Width = 180
        For I = StartRow To LastRow
            Articolo = Cells(I, Voce)
            .AddItem Articolo
            Somma = Cells(I, Num)
            For K = I + 1 To LastRow
              If Articolo = Cells(K, Voce) Then
                I = K
                Somma = Somma + Cells(K, Num)
              Else
                Exit For
              End If
            Next
            .List(.ListCount - 1, 1) = Somma
        Next I
      End With
    End Sub
    



  • di Arturo (utente non iscritto) data: 04/12/2014 01:23:20

    Come detto da lepat (ci sono tre A21)

    Io avrei fatto un Array (dove sommavo i valori)
    Purtroppo credo di non essere capace.
    Ps. Se per caso volete farmi un'esempio sarei grato



  • di Lucas87 data: 04/12/2014 08:26:13

    Ciao
    Invece di costringere chi cerca di aiutarti a capire cosa fa il tuo codice (se hai già un codice e sei qui a chiedere consigli significa che il codice ha dei problemi, quindi studiarlo non ci aiuta a capire cosa vuoi fare), non è più semplice spiegare a parole comprensibili quello che vuoi ottenere, magari allegando un esempio con le dovute indicazioni (buttare valori a caso in file non è un'indicazione)?
    Tieni presente che solo tu conosci la situazione in cui ti trovi a operare, quindi considera di spiegare la cosa ad un bambino.



  • di isy data: 04/12/2014 21:13:59

    per Arturo

    Ho modificato il codice utilizzando array come avevi chiesto.

    per Lucas87
    Ho risolto i miei dubbi e ho apportato le necessarie modifiche al codice per poterlo utilizzare in Vb6.

    Sto realizzando un ciclo che apre una serie di file e visualizza i codici utilizzati nel tempo
    Allegato: Riepilogo VBA.xlsm

     
    'In un modulo
    
    Option Explicit
    
    Sub Aggiorna_lista()
    
      Dim LastRow As Long
      Const Voce As String = "B"
      Const Num As String = "C"
      Const startRow As Long = 5
      LastRow = Cells(Rows.Count, Voce).End(3).Row
      If startRow > LastRow Then Exit Sub
      
      Dim Data As Variant, Lista(), arr()
      
      'Original List
      Data = Range(Cells(startRow, Voce), Cells(LastRow, Num))
      
      'Utilizzo un array per filtrare le voci consecutive presenti in data
      ReDim Lista(1 To UBound(Data, 1), 1 To 2)
      
      Dim I As Long
      Dim K As Long
      Dim Riga As Long
      With ActiveSheet.ListBox1
        .ListFillRange = ""
        .Clear
        .ColumnCount = 2
        .ColumnWidths = "120;12"
        .Width = 180
        For I = 1 To UBound(Data, 1)
            Riga = Riga + 1
            Lista(Riga, 1) = Data(I, 1)
            Lista(Riga, 2) = Data(I, 2)
            For K = I + 1 To UBound(Data, 1)
              If Data(I, 1) = Data(K, 1) Then
                I = K
                Lista(Riga, 2) = Lista(Riga, 2) + Data(I, 2)
              Else
                Exit For
              End If
            Next
        Next I
        
        'Utilizzo un array per ridimensionare le voci presenti in lista
        ReDim arr(1 To Riga, 1 To 2)
        For I = 1 To Riga
          arr(I, 1) = Lista(I, 1)
          arr(I, 2) = Lista(I, 2)
        Next
        .List = arr
      End With
    End Sub
    



  • di Arturo (utente non iscritto) data: 04/12/2014 22:18:48

    Grazie ISY

    >>>Come detto da lepat (ci sono tre A21)
    Adesso ho capito, Tu desideravi solo riunire le varie sequenze Ex Riga 6/9/10 ci sono tre A21=74 e nelle celle 13/14 due A101=49.
    Per il resto tutto uguale

    Io pensavo che desideravi ogni voce univoca con il totale.
    Facile se il tutto era fisicamente su celle, mà su un "Forms.ListBox.1" non sarei stato capace.