Somma sottostrutture



  • Somma sottostrutture
    di FLEO data: 18/12/2012 14:03:12

    Ciao a tutti.
    Vorrei sapere se è possibile far sommare dei valori di strutture "figlie" a quella "padre". Mi spiego con un esempio:
    A livello1
    A.A livello2
    A.A.1 livello3 € 10,00
    A.A.2 livello3 € 15,00
    A.B livello2
    A.B.1 livello3 € 20,00
    In pratica, inserendo valori al livello più alto vorrei che mi riportasse le somme a ciascun livello inferiore.
    Lell'esempio sopra, alla fine il risultato dovrebbe essere il seguente:
    A livello1 € 45,00
    A.A livello2 € 25,00
    A.A.1 livello3 € 10,00
    A.A.2 livello3 € 15,00
    A.B livello2 € 20,00
    A.B.1 livello3 € 20,00
    Grazie in anticipo.



  • di Vecchio Frac data: 18/12/2012 15:04:25

    @Julio
    Sono due domande diverse vero?
    Apri un thread differente, grazie.




  • Somma sottostrutture
    di FLEO (utente non iscritto) data: 19/12/2012 11:34:40

    Si, è una domanda diversa.



  • di Vecchio Frac data: 19/12/2012 11:54:29

    E' da ieri che ci sto pensando, ma non riesco a trovare un approccio efficiente.





  • di Vecchio Frac data: 19/12/2012 12:07:08

    Finora ho prodotto questo, ma è migliorabile.
    La tabella di valori va da A a C e ripropone la tua struttura.
    C'è un'intestazione di riga ("desc", "liv" e "euro").

    desc----liv----euro
    A-------L1----
    A.A-----L2----
    A.A.1---L3----10

    eccetera. Ho ricostruito esattamente la tua tabella.
    Funziona, ma sono convinto che si possa fare di meglio ^_^
     
    Option Explicit
    
    Sub somma_strutture()
    Dim s As String, cella As Range, somma As Integer, table As Range, r As Range
    
        Set table = Range(Cells(2, "A"), Cells([COUNTA(A:A)], "A"))
        [a1].Sort key1:=[B:B], header:=xlYes
        
        For Each cella In table
            
            somma = 0
            
            If Val(cella.Offset(, 2)) = 0 Then
    
                [a1].AutoFilter field:=1, Criteria1:=cella & "*"
                
                For Each r In table
                    If Not r.EntireRow.Hidden Then
                         somma = somma + r.Offset(, 2)
                    End If
                Next
                
                cella.Offset(, 2) = somma
        
            End If
            
        Next
        
        [a1].AutoFilter
        [a1].Sort key1:=[A:A], header:=xlYes
            
        MsgBox "Fatto."
    
    End Sub





  • Somma sottostrutture
    di FLEO (utente non iscritto) data: 20/12/2012 09:27:20

    Grazie della risposta.
    Il problema sta anche nel fatto che conosco excel ma poco le macro, niente il VBA.
    In pratica non so cosa fare: devo creare una macro con il testo che hai scritto?
    Un altro dubbio: il mio archivio, su cui dovrei fare tali somme, consta di circa 1500 righe... va bene lo stesso?
    Grazie di nuovo.
    Ciao


  • Somma sottostrutture
    di FLEO (utente non iscritto) data: 20/12/2012 11:00:18

    Ho provato a creare una macro ed ho sostituito il tuo testo.
    Tutto perfetto!
    Ti chiedo una sola modifica:
    l'importo corrispondente alla cella con "A" dovrebbe avere il risultato di questa formula:
    ((A.R + A.S + A.T + A.V)-(A.A + A.C + A.D + A.F A.P + A.Q))
    In pratica vanno sommati i gruppi di 2° livello come sopra descritto.
    Grazie di nuovo.



  • di Vecchio Frac data: 20/12/2012 11:45:44

    Che l'archivio sia di 1.500 o di 15.000 righe è ininfluente perchè la riga
    Set table = Range(Cells(2, "A"), Cells([COUNTA(A:A)], "A"))
    imposta la tabella di lavoro sul numero di righe compilate.
    Si deve fare attenzione però che non vi siano righe vuote in mezzo altrimenti sarebbe meglio cambiare tale assegnazione con questa:
    Set table = Range("A2:A" & Cells(Columns(1).Cells.Count, 1).End(xlUp).Row)

    Sulla somma dei gruppi di 2° livello, questo riguarda soltanto il codice che comincia con "A" letteralmente?
    I codici indicati sono esattamente quelli che si trovano nelle celle? perchè allora la cosa si semplifica (se invece mi dici: no, sono codici fittizi e vanno sommati solo i gruppi di secondo livello allora va indicato un criterio più preciso) :)






  • di Vecchio Frac data: 20/12/2012 13:57:12

    Ho rivisto il codice con la modifica che hai richiesto, se devo far risultare in corrispondenza di "A" il risultato di questa formula, cercando letteralmente i codici A.* come indicati.
    ((A.R + A.S + A.T + A.V)-(A.A + A.C + A.D + A.F + A.P + A.Q)) 


     
    Option Explicit
    
    Sub somma_strutture()
    Dim s As String, cella As Range, somma As Integer, table As Range, r As Range, v As Variant
    Dim s1 As Integer, s2 As Integer
    
        Set table = Range(Cells(2, "A"), Cells([COUNTA(A:A)], "A"))
        [a1].Sort key1:=[B:B], header:=xlYes
        
        For Each cella In table
            
            somma = 0
            
            If Val(cella.Offset(, 2)) = 0 Then
    
                [a1].AutoFilter field:=1, Criteria1:=cella & "*"
                
                For Each r In table
                    If Not r.EntireRow.Hidden Then
                         somma = somma + r.Offset(, 2)
                    End If
                Next
                
                cella.Offset(, 2) = somma
        
            End If
            
        Next
        
        [a1].AutoFilter
        [a1].Sort key1:=[A:A], header:=xlYes
        
        Names.Add Name:="table", RefersTo:=table
        
        For Each v In Array("A.R", "A.S", "A.T", "A.V")
            s1 = s1 + Evaluate("SUMIF(table," & Chr(34) & v & Chr(34) & ",OFFSET(table,0,2))")
        Next
        For Each v In Array("A.A", "A.C", "A.D", "A.F", "A.P", "A.Q")
            s2 = s2 + Evaluate("SUMIF(table," & Chr(34) & v & Chr(34) & ",OFFSET(table,0,2))")
        Next
        
        table.Offset(-1).Find("A").Offset(, 2) = s1 - s2
        Names("table").Delete
        
        MsgBox "Fatto."
    
    End Sub





  • Somma sottostrutture
    di FLEO (utente non iscritto) data: 20/12/2012 15:36:16

    SEI UN GRANDE!!!
    Tutto perfetto. GRAZIE!