XL 2010 Additionner les doublons

Lynattendu

XLDnaute Junior
Bonjour,
tout d’abord bonne et heureuse année à tous.
Sinon j’ai un petit problème, si quelqu’un a une idée je suis preneuse car je ne trouve pas.
je ne vois pas comment faire avec le filtre avancé pour additionner les doublons mais que le nom du doublons n’apparaisse qu’une fois. Je m’explique dans ma feuille commande j’ai des fois le même ingrédient qui apparait mais avec des quantités différentes. Ça c’est bon seulement je voudrais que sur la feuille liste commande le nom du doublons n’apparaisse qu’une fois ( sur une ligne) mais que les quantités ainsi que le total prix des doublons s’additionnent. ( le tout sur une même ligne) . Je joins un fichier pour que ce soit plus clair , ou j’ai donné des infos sur la feuille commande et sur la feuille liste commande. Je pensais pouvoir faire celà avec le filtre avancé mais je n‘y arrive pas . il y a sûrement un moyen peut être du code je ne sais pas. si quelqu’un peux m’aider . Merci d’avance.
 

Pièces jointes

  • Test1 Commande.xlsm
    37.1 KB · Affichages: 15

Robert

XLDnaute Barbatruc
Repose en paix
Bonjour Lynattendu, bonjour le forum,

Peut-être comme ça :

VB:
Sub Macro1()
Dim OC As Worksheet 'déclare la variable OC (Onglet Commande)
Dim OL As Worksheet 'déclare la variable OL (Onglet Liste commande)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim TMP As Variant 'déclare la variable TMP (tableau TeMPoraire)
Dim K As Integer 'déclare la variable K (incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)
Dim L As Integer 'déclare la variable L (incrément)

Set OC = Worksheets("Commande") 'définit l'onglet OC
Set OL = Worksheets("liste commande") 'définit l'onglet OL
OL.Range("A3:F" & Application.Rows.Count).ClearContents 'efface d'éventuelles anciennes données de l'onglet OL
TV = OC.Range("A6").CurrentRegion 'définit le tableau des valeurs TV
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
    D(TV(I, 7)) = "" 'alimente le dictionnaire avec la donnée en colonne 7 (l'ingrédient)
Next I 'prochaine ligne de la boucle
TMP = D.keys 'récupère dans le tableau temporaire TMP la liste des éléments du dictionnaire D sans doublon
K = 1 'initialise la variable K
For J = 0 To UBound(TMP) 'boucle 1 : sur tous les éléments du tableau temporaire TMP
    For I = 2 To UBound(TV, 1) 'boucle 2 : sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
        If TMP(J) = TV(I, 7) Then 'condition : si lélément J de TMP(J) est égal a l'ingrédient en colonne 7 de TV
            ReDim Preserve TL(1 To 6, 1 To K) 'redimensionne le tableau des lignes (6 lignes, K colonnes)
            For L = 1 To 6 'boucle 3 sur les 6 colonnes du tableau des lignes TL
                Select Case L 'agit en fonction de la colonne L
                    Case 2, 6 'colonnes 2 et 6
                        TL(L, K) = Round(TL(L, K) + TV(I, L + 6), 2) 'récupère dans la ligne L de TL la donnée en colonne L + 6 de TV en l'ajoutant (=> Transposition)
                    Case Else 'autre colonnes
                        TL(L, K) = TV(I, L + 6) 'récupère dans la ligne L de TL la donnée en colonne L + 6 de TV (=> Transposition)
                End Select 'fin de l'acion en fonction de la colonne L
            Next L 'prochaine colonne de la boucle 3
        End If 'fin de la condition
    Next I 'prochaine ligne de la boucle 2
    K = K + 1 'incrémente K (ajoute une colonne au tableau des lignes TL)
Next J 'prochain élément de la boucle 1
'renvoie dans A3 redimensionnée de l'onglet OL, le tableau TL transposé
OL.Range("A3").Resize(UBound(TL, 2), UBound(TL, 1)).Value = Application.Transpose(TL)
End Sub
 

Lynattendu

XLDnaute Junior
Bonjour Lynattendu, bonjour le forum,

Peut-être comme ça :

VB:
Sub Macro1()
Dim OC As Worksheet 'déclare la variable OC (Onglet Commande)
Dim OL As Worksheet 'déclare la variable OL (Onglet Liste commande)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim I As Integer 'déclare la variable I (Incrément)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim TMP As Variant 'déclare la variable TMP (tableau TeMPoraire)
Dim K As Integer 'déclare la variable K (incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)
Dim L As Integer 'déclare la variable L (incrément)

Set OC = Worksheets("Commande") 'définit l'onglet OC
Set OL = Worksheets("liste commande") 'définit l'onglet OL
OL.Range("A3:F" & Application.Rows.Count).ClearContents 'efface d'éventuelles anciennes données de l'onglet OL
TV = OC.Range("A6").CurrentRegion 'définit le tableau des valeurs TV
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 2 To UBound(TV, 1) 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
    D(TV(I, 7)) = "" 'alimente le dictionnaire avec la donnée en colonne 7 (l'ingrédient)
Next I 'prochaine ligne de la boucle
TMP = D.keys 'récupère dans le tableau temporaire TMP la liste des éléments du dictionnaire D sans doublon
K = 1 'initialise la variable K
For J = 0 To UBound(TMP) 'boucle 1 : sur tous les éléments du tableau temporaire TMP
    For I = 2 To UBound(TV, 1) 'boucle 2 : sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde)
        If TMP(J) = TV(I, 7) Then 'condition : si lélément J de TMP(J) est égal a l'ingrédient en colonne 7 de TV
            ReDim Preserve TL(1 To 6, 1 To K) 'redimensionne le tableau des lignes (6 lignes, K colonnes)
            For L = 1 To 6 'boucle 3 sur les 6 colonnes du tableau des lignes TL
                Select Case L 'agit en fonction de la colonne L
                    Case 2, 6 'colonnes 2 et 6
                        TL(L, K) = Round(TL(L, K) + TV(I, L + 6), 2) 'récupère dans la ligne L de TL la donnée en colonne L + 6 de TV en l'ajoutant (=> Transposition)
                    Case Else 'autre colonnes
                        TL(L, K) = TV(I, L + 6) 'récupère dans la ligne L de TL la donnée en colonne L + 6 de TV (=> Transposition)
                End Select 'fin de l'acion en fonction de la colonne L
            Next L 'prochaine colonne de la boucle 3
        End If 'fin de la condition
    Next I 'prochaine ligne de la boucle 2
    K = K + 1 'incrémente K (ajoute une colonne au tableau des lignes TL)
Next J 'prochain élément de la boucle 1
'renvoie dans A3 redimensionnée de l'onglet OL, le tableau TL transposé
OL.Range("A3").Resize(UBound(TL, 2), UBound(TL, 1)).Value = Application.Transpose(TL)
End Sub
Bonsoir,
merci beaucoup c’est au top ça fonctionne . Merci
 

eriiic

XLDnaute Barbatruc
Bonjour et bonne année à tous,

c'est le domaine rêvé des TCD (tableaux croisés dynamiques) ça.
0 formule, 0 vba (enfin si, juste une ligne pour ne pas à avoir à l'actualiser manuellement).

Ca vaut le coup de prendre 1/2h pour comprendre leur philosophie : Tableau Croisé Dynamique (TCD) : http://www.mdf-xlpages.com/modules/smartsection/item.php?itemid=109
eric
 

Pièces jointes

  • Test1 Commande.xlsm
    46.8 KB · Affichages: 6

Discussions similaires

Statistiques des forums

Discussions
312 092
Messages
2 085 223
Membres
102 826
dernier inscrit
ag amestan