Se connecter avec
S'enregistrer | Connectez-vous

additionner des lignes par clef

Dernière réponse : dans Programmation

Bonjour,
je cherche à faire une macro sous VB-excel qui permet d'ajouter les lignes qui ont la même clef,par exemple

si j'ai ces deux colonnes :
A B
1 45
1 5
1 6
3 7
5 9
3 8
j'aimerai faire la somme sur la colonne B mais quand la cellule de la même ligne dans la colonne A contient 1, puis 3 puis 5, en finale je voudrais récupérer 3 valeurs (car la colonne A possède 3 clefs)

Autres pages sur : additionner lignes clef

Lassé par la pub ? Créez un compte
Expert Programmation

M'enfin, Excel est un tableur, pas une base de données !

Admettons que tu sois obligé de le faire parce que ton patron s'appelle Ténardier...

Trie tes données
Initialise une variable de rupture avec la première valeur de la colonne A
Initialise une variable accumulateur à 0.
Parcours toutes les cellules de ta colonne A.
Si la valeur de la cellule courante est égale à la valeur de rupture Alors
Ajoute la valeur de la cellule de la colonne B dans l'accumulateur.
Sinon
Récupère le couple (rupture, accumulateur)
Zérote l'accumulateur
Mets la valeur de la cellule en cours dans la var. de rupture.

Enjoy!

Bonjour,

J'ai un peu le même problème, bien que débutant je commence à maîtriser vba, cependant en ce qui concerne les variables je suis un peu léger.
Je suis sur le point de finir un fichier assez complexe qui comprend beaucoup de vba, quelques formulaires et j'ai utilisé (car j'y étais obligé) excel comme support.

Pour finaliser ma première "grosse oeuvre" en vba j'ai besoin d'une part de sommer des cellules d'une même colonne en fonction d'une clé tout comme "toiness" mais je dois également ensuite "supprimer" les lignes inutiles.

Exemple :

Ceci resssemble à ce que j'ai :

N° de lignes CLE VALEUR
1 A 10
2 A 20
3 A 30
4 B 15
5 B 25

et ceci est ce que je souhaiterais obtenir :

N° de lignes CLE VALEUR
1 A 60
2 B 40

Les lignes ayant la même clé ont été sommées puis "filtrées" afin de ne pas avoir de doublons.

Je n'exclus evidemment pas la possibilité de "copier" ces lignes vers un autre onglet si supprimer les doublons s'avérait trop complexe.

Merci d'avance pour toute aide qui pourra m'être apportée, je tiens à préciser que comme beaucoup j'apprends vb sur le tas et que après avoir beaucoup cherché je n'ai pas trouvé de code ressemblant à ce que je veux faire afin de le décrypter pour l'adapter a mon besoin.
Expert Programmation

Citation :
Les lignes ayant la même clé ont été sommées puis "filtrées" afin de ne pas avoir de doublons.
ça, c'est déjà fait ? Où (Feuille, Classeur/Variables) ?

A partir de là, supprime les lignes de départ et copie-y le résultat.

Non ce n'est pas déjà fait, c'est le résultat que je veux obtenir où "Les lignes ayant la même clé ont été sommées puis "filtrées" afin de ne pas avoir de doublons"

Dans mon exemple tu as un "avant" et un "après", l'"avant" c'est ce que j'ai déjà et l'"après" c'est e que je souhaite obtenir.
Expert Programmation

Ok. Je te propose alors de créer une feuille de calcul temporaire. Copie-s'y tes données. Applique alotrs les transformations voulues, dans la feuille temp. Supprime les données d'origine et recopie de la feuille temp. vers la feulle d'origine les données traitées. Il reste à supprimer la feuille temp.

Puisque tu apprends sur le tas, je te conseille très fortement l'utilisation de l'enregistreur de macros pour apprendre, valider ou découvrir comment faire telle action triviale comme créer une feuille ou copier des données. Analyse bien les macros enregistrées avec l'aide en ligne, ta jujotte (tu n'en manques pas j'en suis sûr, pour t'avoir lu ailleurs ;)  ) et PPC :D 

Merci, mais ou m'as tu lu? Dans ce forum? :) 

Cela fait près d'un an que j'ai créé ma première macro et mes premiers codes et même si j'ai rapidement appris, je n'ai pas été amené à utiliser tout ce que recèle VB et en matière de variables et de boucles notamment je suis au niveau le plus bas :) 

En fait je ne peux pas enregistrer une macro qui ferait ce que je veux faire car ce n'est manuellement pas possible.

J'ai déjà créé la première partie du code qui me crée une colonne CLE (c'est en fait un concatener des differentes valeurs dont je veux sommer le total affilié, comme le mois, le nom etc).
Ensuite ces valeurs sont triées par ordre décroissant.

Je sais qu'en suite je dois définir une variable (1) qui prendra la valeur de la première cellule de ma colonne CLE, une seconde variable (2) initialisée à 0 qui sommera les valeurs.

En gros ça donnera (en "français") :

Tant que la valeur de la cellule de ma colonne de CLE est égale à ma variable 1 alors variable 2 = variable 2 + valeur correspondante à la cellule CLE.

Dès que la cellule de ma colonne clé change de valeur alors on copie la ligne vers une autre feuille et dans la partie "montant" (ce sont mes valeurs aditionnées) on écrit la valeur de ma variable 2.

Puis on zérote les 2 variables et on recommence à la ligne en dessous.


J'espère être clair car ne maitrisant pas tous les termes techniques il est possible que je sois le seul à me comprendre :D 


Mon problème est donc de créer une boucle avec ces 2 variables puis de copier les données à chaque "rupture".

hehe en fait j'ai posté mon code just avant de lire ton message.

Et il marche très bien (il est très simple de toute façon) + très facilement adaptable car assez court et sans ambigüité.

Si une âme charitable pouvait en faire de même pour moi :$ ou au moins me donner quelques pistes car je sais ce que je veux faire, je sais comment procéder mais je ne sais pas comment écrire le code :s

Bien voici ou j'en suis, je ne sais pas écrire le reste, j'ai donc mis des commentaires quand je coincais ...

  1. Sub compiler()
  2. r = Sheets("envoi").Range("O3").Value
  3. 'r est la valeur de ma clé, ma colonne CLE est sur la feuille envoi, colonne O et commence ligne 3
  4. a = 0
  5. 'a est ma variable accumulateur
  6. i = 3
  7. Sheets("envoi").Select
  8.  
  9.  
  10. While Not Range("O" & i & "").Value = r
  11.  
  12. a = X
  13.  
  14. 'ici je dois remplacer X par la somme des montants se situant dans ma colonne O mais je ne sais pas comment faire
  15.  
  16.  
  17. Wend
  18.  
  19.  
  20. 'ici il faut que j'écrive du code pour sélectionner ma dernière ligne avant changement de clé
  21.  
  22.  
  23. j = 1
  24.  
  25. Sheets("compil").Select
  26. 'c'est la feuille vers laquelle les données compilées sont extraites
  27.  
  28. While Not Range("B" & i & "").Value = ""
  29.  
  30. j = j + 1
  31.  
  32. Wend
  33.  
  34. Range("B" & j).Select
  35.  
  36. Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
  37. :=False, Transpose:=False
  38.  
  39. Range("K" & j).Value = r
  40. 'ici je me place dans la cellule "montant" pour lui donner la valeur de ma variable r
  41.  
  42. 'il faut rajouter une boucle afin de reprendre la compilation là où elle s'est arrêtée
  43.  
  44.  
  45. End Sub
Expert Programmation

Citation :
en fait j'ai posté mon code just avant de lire ton message.
Alors vas-y, il est où ton code, qu'on le critique (objectivement) et qu'on te dise comment (mieux) faire ?
Expert Programmation

Eh, eh. petitee incompréhension à quelques secondes près :

Dimitrifrom31 Posté le 31-07-2006 à 12:29:26
zeb Posté le 31-07-2006 à 12:30:44

Je regarde ton code......
Expert Programmation

Eh, là, ne t'impatiente pas ! (voir un autre post [:zeb] ) Prière de ne pas mélanger les topics


Alors concernant ton problème (pas celui de cross-post :D , celui de rupture).

D'abord, quelques remarques :

  • Compiler est un mot qui a une signification bien précise en informatique et que tu utilises à tord.
  • Prière de mettre les commentaires avant plutôt qu'après, juste par convention.
  • Ne pas faire comme l'enregistreur de macro : NE PAS UTILISER
    1. <truc>.Select
    2. Selection.<machin>
    Mais directement :
    1. <truc>.<machin>

  • Supprimer l'inutile :
    1. Non : "O" & i & ""
    2. Oui : "N" & i

  • Utiliser l'Option Explicit. Déclarer toutes les variables. IMPERATIF !
  • Ne pas utiliser While .. Wend mais Do .. Loop (Euh là, tu fais comme tu veux)

    Je propose ceci :

    1. Sub Toto()
    2. Dim c0 As Range
    3. Dim c1 As Range
    4. Dim r As String
    5. Dim a As Integer
    6.  
    7. ' // Tri
    8. Sheets("Feuil1").Range("A:B").Sort Key1:=Range("A1")
    9.  
    10. Set c0 = Sheets("Feuil1").Range("A1")
    11. Set c1 = Sheets("Feuil2").Range("A1")
    12.  
    13. r = c0.Value
    14. a = 0
    15.  
    16. ' // Boucle infinie
    17. Do While True
    18.  
    19. If c0.Value = r Then
    20. ' // Pas de rupture, on accumule
    21. a = a + c0.Offset(0, 1).Value
    22. Else
    23. ' // Rupture
    24. c1.Value = r
    25. c1.Offset(0, 1).Value = a
    26. a = 0
    27. Set c1 = c1.Offset(1, 0)
    28. End If
    29.  
    30. r = c0.Value
    31. Set c0 = c0.Offset(1, 0)
    32.  
    33. ' // Fin de la boucle infinie (ouf)
    34. If r = "" Then Exit Do
    35. Loop
    36. End Sub


    1°) Merci de comprendre et d'adapter ce code à tes besoins.
    2°) Pour info, l'algo est explicité au début du topic, l'aide en ligne est disponible pour tout comprednre. Je pense en particulier à la méthode Offset.

    Toute question est la bien venue, surtout si le point 1°) a été respecté.

    Enjoy!

    Merci pour ton aide et ton temps passé à répondre, désolé pour le non respect des conventions mais ayant appris par moi même il est vrai que je ne fais pas tout dans les règles de l'art.

    Ton code m'apprend certaines choses qui me seront probablement utiles :) 

    Néanmoins je suis en train d'expérimenter une solution alternative qui devrait accélérer la procédure :

    Voilà en quelques mots ce que je suis en train de faire :

    Sur ma feuille ou se trouvent mes données réparties sur plusieurs colonnes (dont 1 est celle que je veux sommer) j'ai créé une colonne CLE qui est un concaténer de certaines colonnes (conditions).

    A partir de la je poseun filtre avancé sur ma colonne clé pour masquer les doublons.
    Du coup ma feuille est bien nettoyée des doublons mais il n'y a évidemment toujours pas de somme des montants.

    Je sélectionne ensuite ma plage de données filtrées puis je vais la coller sur une autre feuille (et de la même façon je crée une colonne ou sont concaténées mes données, exactement comme sur ma feuille source).

    Cependant ma colonne de montants est toujours fausse, je supprime donc les valeurs qu'elle contient et je fais un SOMME.SI avec en plage la colonne de données concaténées de ma feuille source, en condition la cellule de données concaténées de ma seconde feuille et je somme la plage de la colonne "montants" de ma feuille source.

    Du coup mes doublons sont virés et les montants sont sommés :D 

    Ce n'est pas tout à fait terminé mais ça à l'air de marcher :) 
    Je posterai mon code une fois terminé au cas ou ça puisse aider quelqu'un.
    Expert Programmation

    Ah, ah, je savais bien que celui-là avait un peu de jujotte. Mais ce que tu te proposes de faire, c'est de mieux utiliser Excel.
    Or tu postes dans la catégorie PROGRAMMATION, sous catégorie VB ! Comment te proposer autre chose que du VBA.

    Avant d'utiliser VBA pour Excel, il est recommander de connaître Excel
    (L'avis vaut pour moi aussi :whistle:  )

    Au temps pour moi mais je ne savais pas en débutant ce sujet que je finirais par trouver ce genre d'alternative.

    Voici donc ma solution si elle peut servir a quelqu'un précédée de 2 captures d'écran pour s'y retrouver un peu :

    Ma feuille de données source (non filtrées) :



    Ma feuille d'extraction (données filtrées) :



    Le code qui va avec :

    1. Sub compilation()
    2. 'Ceci est une macro qui trie mes données de façon décroissante
    3. Call trienvoi
    4. 'Activation de la feuille données sources
    5. Sheets("envoi").Activate
    6. 'Sélection de la colonne CLE qui est la concaténation de différentes conditions
    7. Columns("O:O").Select
    8. 'Copier-Coller en valeur de cette colonne sur la colonne voisine afin de filtrer
    9. 'les doublons car le filtrage des doublons ne marche pas sur mes formules
    10. Selection.Copy
    11. Columns("P:P").Select
    12. Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    13. :=False, Transpose:=False
    14. Application.CutCopyMode = False
    15. 'Filtrage des doublons
    16. Columns("P:P").AdvancedFilter Action:=xlFilterInPlace, Unique:=True
    17. 'Mes doublons étant filtrés je sélectionne désormais ma plage de valeurs filtrées
    18. Range("B3").Select
    19. Range(Selection, Selection.End(xlToRight)).Select
    20. Range(Selection, Selection.End(xlDown)).Select
    21. Selection.Copy
    22. 'Je vais copier cette plage sur une feuille d'extraction
    23. Sheets("compil").Activate
    24. Range("B2").Select
    25. Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    26. :=False, Transpose:=False
    27. 'Je supprime les valeurs de la colonne montants car ils sont faux puiqu'ils
    28. 'correspondent au montant d'une ligne et non pas a la somme des montants
    29. 'de lignes identiques comme je le souhaite
    30. Range("K2").Select
    31. Range(Selection, Selection.End(xlDown)).Select
    32. Application.CutCopyMode = False
    33. Selection.ClearContents
    34. 'Je retourne sur ma feuille de données source afin de réafficher toutes mes valeurs :
    35. 'J'ôte le filtrage des doublons
    36. Sheets("envoi").Select
    37. ActiveSheet.ShowAllData
    38. 'Je reviens sur ma feuille d'extraction et j'écris une somme.si dans la colonne montant
    39. 'afin de sommer les montants des lignes identiques de ma feuille source
    40. Sheets("compil").Activate
    41. Range("K2").Select
    42. ActiveCell.FormulaR1C1 = "=SUMIF(envoi!C[4],RC[4],envoi!C)"
    43. Selection.AutoFill Destination:=Range("K2:K3000")
    44.  
    45.  
    46. End Sub
    Expert Programmation

    Ah mais tu fais quand même ça avec du VB. Cool :D 
    Citation :
    Au temps pour moi mais je ne savais pas en débutant ce sujet que je finirais par trouver ce genre d'alternative.
    Pas de problème. Merci d'avoir posté ta soluce ;) 

    playerrr a dit :
    Au temps pour moi mais je ne savais pas en débutant ce sujet que je finirais par trouver ce genre d'alternative.

    Voici donc ma solution si elle peut servir a quelqu'un précédée de 2 captures d'écran pour s'y retrouver un peu :

    Ma feuille de données source (non filtrées) :

    http://skullnbones.free.fr/1154359871source.jpg

    Ma feuille d'extraction (données filtrées) :

    http://skullnbones.free.fr/1154359949compil.jpg

    Le code qui va avec :

    1. Sub compilation()
    2. 'Ceci est une macro qui trie mes données de façon décroissante
    3. Call trienvoi
    4. 'Activation de la feuille données sources
    5. Sheets("envoi").Activate
    6. 'Sélection de la colonne CLE qui est la concaténation de différentes conditions
    7. Columns("O:O").Select
    8. 'Copier-Coller en valeur de cette colonne sur la colonne voisine afin de filtrer
    9. 'les doublons car le filtrage des doublons ne marche pas sur mes formules
    10. Selection.Copy
    11. Columns("P:P").Select
    12. Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    13. :=False, Transpose:=False
    14. Application.CutCopyMode = False
    15. 'Filtrage des doublons
    16. Columns("P:P").AdvancedFilter Action:=xlFilterInPlace, Unique:=True
    17. 'Mes doublons étant filtrés je sélectionne désormais ma plage de valeurs filtrées
    18. Range("B3").Select
    19. Range(Selection, Selection.End(xlToRight)).Select
    20. Range(Selection, Selection.End(xlDown)).Select
    21. Selection.Copy
    22. 'Je vais copier cette plage sur une feuille d'extraction
    23. Sheets("compil").Activate
    24. Range("B2").Select
    25. Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
    26. :=False, Transpose:=False
    27. 'Je supprime les valeurs de la colonne montants car ils sont faux puiqu'ils
    28. 'correspondent au montant d'une ligne et non pas a la somme des montants
    29. 'de lignes identiques comme je le souhaite
    30. Range("K2").Select
    31. Range(Selection, Selection.End(xlDown)).Select
    32. Application.CutCopyMode = False
    33. Selection.ClearContents
    34. 'Je retourne sur ma feuille de données source afin de réafficher toutes mes valeurs :
    35. 'J'ôte le filtrage des doublons
    36. Sheets("envoi").Select
    37. ActiveSheet.ShowAllData
    38. 'Je reviens sur ma feuille d'extraction et j'écris une somme.si dans la colonne montant
    39. 'afin de sommer les montants des lignes identiques de ma feuille source
    40. Sheets("compil").Activate
    41. Range("K2").Select
    42. ActiveCell.FormulaR1C1 = "=SUMIF(envoi!C[4],RC[4],envoi!C)"
    43. Selection.AutoFill Destination:=Range("K2:K3000")
    44.  
    45.  
    46. End Sub


    Bonjour,

    Est-ce que quelqu'un peut m'expliquer cette formule à la ligne 42 ?

    ActiveCell.FormulaR1C1 = "=SUMIF(envoi!C[4],RC[4],envoi!C)"

    Merci d'avance
    Lassé par la pub ? Créez un compte