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)
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
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!
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.
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.
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
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
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
Mon problème est donc de créer une boucle avec ces 2 variables puis de copier les données à chaque "rupture".
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
Mon problème est donc de créer une boucle avec ces 2 variables puis de copier les données à chaque "rupture".
Je te lis ici
Alors propose ton code à la critique, même s'il manque des morceaux et même s'il ne fonctionne pas (encore).
Alors propose ton code à la critique, même s'il manque des morceaux et même s'il ne fonctionne pas (encore).
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
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 ...
Sub compiler()
r = Sheets("envoi").Range("O3").Value
'r est la valeur de ma clé, ma colonne CLE est sur la feuille envoi, colonne O et commence ligne 3
a = 0
'a est ma variable accumulateur
i = 3
Sheets("envoi").Select
While Not Range("O" & i & "").Value = r
a = X
'ici je dois remplacer X par la somme des montants se situant dans ma colonne O mais je ne sais pas comment faire
Wend
'ici il faut que j'écrive du code pour sélectionner ma dernière ligne avant changement de clé
j = 1
Sheets("compil").Select
'c'est la feuille vers laquelle les données compilées sont extraites
While Not Range("B" & i & "").Value = ""
j = j + 1
Wend
Range("B" & j).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Range("K" & j).Value = r
'ici je me place dans la cellule "montant" pour lui donner la valeur de ma variable r
'il faut rajouter une boucle afin de reprendre la compilation là où elle s'est arrêtée
End Sub
Pardon petitee incompréhension, le code qui fonctionne et dont je parlais est celui qui répond à la question d'un autre ici :
http://www.presence-pc.com/forum/ppc/Programmation/Exce...
Sinon j'ai posté plus haut mon code incomplet qui ne peut évidemment pas marcher
http://www.presence-pc.com/forum/ppc/Programmation/Exce...
Sinon j'ai posté plus haut mon code incomplet qui ne peut évidemment pas marcher
Eh, là, ne t'impatiente pas ! (voir un autre post
) Prière de ne pas mélanger les topics
Alors concernant ton problème (pas celui de cross-post
, 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
Supprimer l'inutile :
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°) 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!
) Prière de ne pas mélanger les topicsAlors concernant ton problème (pas celui de cross-post
, celui de rupture).D'abord, quelques remarques :
Mais directement :
<truc>.Select
Selection.<machin>
<truc>.<machin>
Non : "O" & i & ""
Oui : "N" & i
Je propose ceci :
Sub Toto()
Dim c0 As Range
Dim c1 As Range
Dim r As String
Dim a As Integer
' // Tri
Sheets("Feuil1").Range("A:B").Sort Key1:=Range("A1")
Set c0 = Sheets("Feuil1").Range("A1")
Set c1 = Sheets("Feuil2").Range("A1")
r = c0.Value
a = 0
' // Boucle infinie
Do While True
If c0.Value = r Then
' // Pas de rupture, on accumule
a = a + c0.Offset(0, 1).Value
Else
' // Rupture
c1.Value = r
c1.Offset(0, 1).Value = a
a = 0
Set c1 = c1.Offset(1, 0)
End If
r = c0.Value
Set c0 = c0.Offset(1, 0)
' // Fin de la boucle infinie (ouf)
If r = "" Then Exit Do
Loop
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
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.
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
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.
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
)
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
)
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 :
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 :
Sub compilation()
'Ceci est une macro qui trie mes données de façon décroissante
Call trienvoi
'Activation de la feuille données sources
Sheets("envoi").Activate
'Sélection de la colonne CLE qui est la concaténation de différentes conditions
Columns("O:O").Select
'Copier-Coller en valeur de cette colonne sur la colonne voisine afin de filtrer
'les doublons car le filtrage des doublons ne marche pas sur mes formules
Selection.Copy
Columns("P:P").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
'Filtrage des doublons
Columns("P:P").AdvancedFilter Action:=xlFilterInPlace, Unique:=True
'Mes doublons étant filtrés je sélectionne désormais ma plage de valeurs filtrées
Range("B3").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
'Je vais copier cette plage sur une feuille d'extraction
Sheets("compil").Activate
Range("B2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'Je supprime les valeurs de la colonne montants car ils sont faux puiqu'ils
'correspondent au montant d'une ligne et non pas a la somme des montants
'de lignes identiques comme je le souhaite
Range("K2").Select
Range(Selection, Selection.End(xlDown)).Select
Application.CutCopyMode = False
Selection.ClearContents
'Je retourne sur ma feuille de données source afin de réafficher toutes mes valeurs :
'J'ôte le filtrage des doublons
Sheets("envoi").Select
ActiveSheet.ShowAllData
'Je reviens sur ma feuille d'extraction et j'écris une somme.si dans la colonne montant
'afin de sommer les montants des lignes identiques de ma feuille source
Sheets("compil").Activate
Range("K2").Select
ActiveCell.FormulaR1C1 = "=SUMIF(envoi!C[4],RC[4],envoi!C)"
Selection.AutoFill Destination:=Range("K2:K3000")
End Sub
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 :
Sub compilation()
'Ceci est une macro qui trie mes données de façon décroissante
Call trienvoi
'Activation de la feuille données sources
Sheets("envoi").Activate
'Sélection de la colonne CLE qui est la concaténation de différentes conditions
Columns("O:O").Select
'Copier-Coller en valeur de cette colonne sur la colonne voisine afin de filtrer
'les doublons car le filtrage des doublons ne marche pas sur mes formules
Selection.Copy
Columns("P:P").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Application.CutCopyMode = False
'Filtrage des doublons
Columns("P:P").AdvancedFilter Action:=xlFilterInPlace, Unique:=True
'Mes doublons étant filtrés je sélectionne désormais ma plage de valeurs filtrées
Range("B3").Select
Range(Selection, Selection.End(xlToRight)).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
'Je vais copier cette plage sur une feuille d'extraction
Sheets("compil").Activate
Range("B2").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'Je supprime les valeurs de la colonne montants car ils sont faux puiqu'ils
'correspondent au montant d'une ligne et non pas a la somme des montants
'de lignes identiques comme je le souhaite
Range("K2").Select
Range(Selection, Selection.End(xlDown)).Select
Application.CutCopyMode = False
Selection.ClearContents
'Je retourne sur ma feuille de données source afin de réafficher toutes mes valeurs :
'J'ôte le filtrage des doublons
Sheets("envoi").Select
ActiveSheet.ShowAllData
'Je reviens sur ma feuille d'extraction et j'écris une somme.si dans la colonne montant
'afin de sommer les montants des lignes identiques de ma feuille source
Sheets("compil").Activate
Range("K2").Select
ActiveCell.FormulaR1C1 = "=SUMIF(envoi!C[4],RC[4],envoi!C)"
Selection.AutoFill Destination:=Range("K2:K3000")
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
;O3;envoi!K:K)