Somma condizionale di
Mauro |
somma condizionale di Mauro Salve ragazzi,
avrei bisogno di una mano, se posso disturbarvi. Avendo una
tabella strutturata cosi': NOME IMPORTOA IMPORTOB IMPORTOC
IMPORTOD A B C A A B E F e in
ciascuna cella relativa agli importi una cifra qualsiasi, devo
porter ottenere una seconda tabella di costruzione identica dove i
nomi compaiano una sola volta (anche quelli ripetuti piu' volte) e
nelle celle degli importi, per i nomi uguali presenti piu' volte,
appaia la somma dei loro valori nelle diverse righe. Non sono
capace di costruire la macro. Mi date una mano? Grazie |
|
di TuoOmonimo |
La cosa + semplice secondo me è usare le tabelle
pivot. Seleziona la tabella origine compresi i nomi di riga e
colonna. Da menu Dati segli: rapporto tabella pivot. Entrerai
nella costruzione guidata. Nelle prime 2 schermate premi
avanti>. Arrivato all'ultima schermata premi il tasto Layout.
Trascina il campo nome sul quadro Riga e somma dei campi importo
nel quadro Dati. Ora premi fine ed il gioco è fatto!
Ciao |
|
di Apoben64 |
Ciao Mauro, aiutarti è un piacere , ma non sarebbe
più semplice usare la funzione =SOMMA.SE ? In cui nel secondo foglio
automaticamenre hai per qualsiasi nominativo la somma delle varie
colone. L'uso di una macro comporta perlomeno l'uso di più cicli con
l'istruzione in VBA " For Next " e l'inserimento di variabili con
l'uso di stringhe per individuare il nome e sommare i suoi valori .
Facci sapere ! |
|
di Mauro |
Ciao... grazie per la risposta.L'elenco dei nomi
non è fisso ma determinato da un'altra macro che li estrapola da un
altro elenco a seconda di condizioni precise. Purtroppo è proprio
quello il problema: la creazione di una routine VBA, ma non ci cavo
piede La formula somma.se sarebbe
troppo nidificata da applicare, e poi come faccio a dirgli che deve
controllare che nel range dei nomi ci siano nomi uguali e per tutti
i nomi uguali deve sommare i valori delle rispettive riche, non
avendo riferimenti precisi? |
|
di Apoben64 |
Ciao Mauro, io penso che un esempio sia meglio di
mille parole, per avere un' idea chiara, ti invito prima a guardare
questi due link e vedere se fanno al caso tuo ! Fammi sapere !
http://ennius.interfree.it/vba/vba103.htm
http://ennius.altervista.org/vba/vba136.php |
|
di Mauro |
Ciao Apo. Il 2° link che hai inserito contiene un
esempio molto simile a quello che devo fare io, pero' in maniera
inverita. Mi spiego: li' il criterio di ricerca è dato dal
concatenamento, sulla stessa riga, dei nomi contenuti nelle colonne
dalla B alla E, e come risultato dà la somma dei valori contenuti
nelle celle 1,2,3,ecc... della colonna A. A me serve il contrario.
Provo a fare un esempio. Questo è quello che ho:
NOME
IMP1 IMP2 IMP3 IMP4 IMP5 IMP6 ANGELA 40 40 40 40 40 40
GIUSEPPE 40 40 40 40 40 40 MAURO 40 40 40 40 40 40 MAURO
50 50 50 50 50 50 MAURO 60 60 60 60 60 60 MAURO 70 70 70 70
70 70
Questo quello che vorrei ottenere: NOME IMP1 IMP2
IMP3 IMP4 IMP5 IMP6 ANGELA 40 40 40 40 40 40 GIUSEPPE 40 40
40 40 40 40 MAURO 220 220 220 220 220 220
Ho provato a
modificare la macro di quel link adattandola, ma non c'ho cavato
piede
Grazie, e scusa se
rompo tanto :) |
|
di TuoOmonimo |
Ho capito, le tabelle pivot vi fanno schifo...
Supponendo di avere la tabella origine su Foglio1 prima riga di
intestazione e la tabella risultato su foglio2:
Sub Macro1()
Dim trovato As Boolean Dim ComNome As String Dim TotNome
As Double ' indi = 2 indi2 = 2 Do Until
Sheets("Foglio1").Range("A" & indi).Text = "" ComNome =
Sheets("Foglio1").Range("A" & indi).Text indi1 = 2
trovato = False Do Until Sheets("Foglio2").Range("A" &
indi1).Text = "" If Sheets("Foglio2").Range("A" &
indi1).Text = ComNome Then trovato = True End If indi1 =
indi1 + 1 Loop If trovato = False Then
Sheets("Foglio2").Range("A" & indi2) = ComNome indi2 =
indi2 + 1 End If indi = indi + 1 Loop
indcol = 2
Sheets("Foglio1").Rows("1:1").Copy
Sheets("Foglio2").Rows("1:1").Paste Do Until
Sheets("Foglio1").Cells(2, indcol).Text = "" indriga = 2
TotNome = 0 indi = 2 Do Until
Sheets("Foglio2").Cells(indi, 1).Text = "" indriga = 2
ComNome = Sheets("Foglio2").Cells(indi, 1).Text Do Until
Sheets("Foglio1").Cells(indriga, indcol).Text = "" If
Sheets("Foglio1").Cells(indriga, 1).Text = ComNome Then TotNome
= TotNome + Sheets("Foglio1").Cells(indriga, indcol).Value End
If indriga = indriga + 1 Loop
Sheets("Foglio2").Cells(indi, indcol) = TotNome indi = indi
+ 1 TotNome = 0 Loop indcol = indcol + 1 Loop
End Sub
|
|