Résolu Somme Deux critères VBA

hugo2212

Nouveau membre
Bonsoir à tous,

Je me trouve dans une situation compliquée. Mon niveau de VBA ne me permet pas de résoudre un problème, qui pour vous, sera probablement une promenade de santé.

Le problème est le suivant:

- J'ai un tableau de trois colonnes est de plusieurs milliers de lignes.
- La première colonne (A) correspond à des devises (USD, GBP, EUR ......)
- La deuxième colonne (B) correspond à des pays (US, GB, FR, DE .....)
- la troisième correspond (C) à la valeur de la transaction, ex : 1,000,000.00

J'aimerai pouvoir faire la somme des transactions remplissant les mêmes critères.
Je m'explique: faire la somme des valeurs en colonne (C) de toutes les lignes ayant en (A) et en (B) les mêmes valeurs. CaD,toutes les lignes ayant "USD" en (A) et "US" en (B), par exemple.

Si cela s'arrêtait à une seule combinaison je me serais contenté d'une formule matricielle ou d'un SUMIF.

Or, dans mon cas, je ne connais pas tous les pays ni les devises présents dans mon tableau.

Est-il possible de créer une macro VBA, en prenant en compte le fait de ne pas connaitre toutes les combinaisons possibles, du style suivant:

= Somme((A1:A1000000="USD")*(B1:B1000000="US")*((C1:C1000000))

Cela, bien sur pour toutes les combinaisons possibles présentes dans le tableau.

J'espère que ce message vous semble clair.

Je vous prie de vouloir recevoir, d'avance, ma plus grande reconnaissance.

Hugo2212
 

drul

Obscur pro du hardware
Staff
Salut, on est autorisé à trier le tableau ?
Y a un truc que je pige pas, tu as les valeures en C mais tu veux aussi mettre les sommes en C ... tu comptes faire comment ?
deux petits printscreen d'exemple (avant après) aiderais bien ici ...
 

hugo2212

Nouveau membre


 

hugo2212

Nouveau membre
Salut drul !

Merci pour ta réponse

J’aimerais recréer un tableau en ayant juste une ligne par combinaison et la somme des transactions de cette combinaison en C. Cela pour toutes les combinaison possible du tableau.

Oui je peux vous donner un screenshot !

Tirer le tableau ?

Merci encore,

Hugo2212
 

hugo2212

Nouveau membre
Ah !!
Désolé

Oui, il faut garder le tableau «brut» et en faire un autre à côté.
 

drul

Obscur pro du hardware
Staff
Mais on peut quand même trier la copie ?

Je t'explique mon idée:

1°) on copie les données (idéalement sur une autre feuille si c'est possible)
2°) on trie la copie selon A (principale) et B(secondaire)
3°) on parcours le tableau depuis le bas
3.1°) si A et B de la ligne supérieur = A et B de la ligne actuelle, on additionne C et on détruit la ligne actuelle
3.2°) si A ou B sont différent on laisse la ligne et on passe à la suivante
Qu'en pense tu ?
 

hugo2212

Nouveau membre
C'est une super proposition !

En revanche, je ne sais pas comment le modéliser sur Visual Basic.

Merci bcp pour ton aide !!!!!

PS: Je n'arrive pas à mettre mon exemple en pièce jointe ni un screen-shot dans mon message



 

drul

Obscur pro du hardware
Staff
Pas d'échange de fichier, interdit par la charte.
Pour les screenshots, il faut passer par un hébergeur d'image, comme casimages ou noelshack et poster le lien ici.
As-tu déjà fait un peu de VBA ?
 

hugo2212

Nouveau membre
Ok merci pour l'info !!!

Oui, mais légèrement, je sais faire des boucles simples
et quelques procedures de base.

 

drul

Obscur pro du hardware
Staff
Meilleure réponse
peu de temps a dispo, alors une fois n'est pas coutume, je te pond direct la solution (faudra un peu adapter hein ...):

Code:
Sub test()
Dim lastRow As Long
Dim src As Worksheet
Dim target As Worksheet

Set src = Worksheets("Sheet2")    'Feuille source
Set target = Worksheets("Sheet3") 'Feuille destination
lastRow = src.Cells(Rows.Count, "A").End(xlUp).Row 'on détermine la dernière cellule colonne A de la feuille source
src.Range(src.Cells(1, "A"), src.Cells(lastRow, "C")).Copy target.Range("A1") ' On copie les données A1:Cxxx de source vers dest
With target.Sort ' on trie selon A en 1er en B en 2
        .SortFields.Clear
        .SortFields.Add Key:=Range("A1:A" & lastRow), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .SortFields.Add Key:=Range("B1:B" & lastRow), _
        SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        .SetRange target.Range(target.Cells(1, "A"), target.Cells(lastRow, "C"))
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
End With ' Voila c'est trier
For i = lastRow To 2 Step -1 ' on boucle depuis la fin (attention à la condition de fin de la boucle, c'est peut-être pas la case "2-1" chez toi)
If target.Cells(i, "A").Value = target.Cells(i - 1, "A").Value Then ' si Cell A = Cell A en dessus
    If target.Cells(i, "B").Value = target.Cells(i - 1, "B").Value Then ' si Cell A = Cell A en dessus
        target.Cells(i - 1, "C").Value = target.Cells(i - 1, "C").Value + target.Cells(i, "c").Value 'Alors on additione les 2 C
    target.Cells(i, "A").EntireRow.Delete ' et on désintègre la ligne du bas
    End If
End If
Next ' pis on passe à la suivante
End Sub
 

hugo2212

Nouveau membre
Incroyable !!!!!

Merci beaucoup !

Aurais tu des conseils pour apprendre à coder en VBA, des videos à regarder, des sites à consulter ?

Je regarde principalement des videos sur Youtube mais je n'arrive pas vraiment à m'améliorer ...

Merci pour ton aide si précieuse.

 

drul

Obscur pro du hardware
Staff
ça marche ?

Le mieux c'est au début d'utiliser a outrance l'enregistreur de macro, (et d'essayer d'améliorer l'horrible code qu'il pond) (ici le "tri" vient de l'enregistreur, je l'utilise rarement ...)
Et de beaucoup lire l'aide, elle très bien faite et aussi dispo en français ...
 

hugo2212

Nouveau membre
Je n'ai pas encore eu le temps de la faire tourner, bientot.

Ah oui, très bonnes pistes, merci !!!
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 128
Messages
6 717 852
Membres
1 586 375
Dernier membre
talmo
Partager cette page
Haut