Excel dédoubler en renseignent colonnes

Bonjour,

j'ai 1 liste de produits suivant 4 colonnes.
1er colonne N° Réf (maison) du produit
2eme désignation
3eme nom du fabricant
4 eme réf. produit du fabricant
J'ai pour 1 même Réf. (maison) plusieurs fabricant. Cela me doublonne les lignes de N° Réf. (maison). Je voudrai avoir sur la même ligne dans differentes colonnes les differents fabricant et la colonne suivante le N° de la Réf. fabricant.
J'espere que je suis clair merci de votre aide.

26 réponses

Résumé de la discussion

La discussion porte sur une liste de produits à 4 colonnes où une même référence maison peut avoir plusieurs fabricants, générant des doublons et nécessitant une mise sur une ligne unique avec les fabricants. L’objectif est d’afficher sur la même ligne, dans des colonnes distinctes, les différents fabricants et, en colonne suivante, leur N° de référence fabricant pour chaque référence maison. Plusieurs réponses évoquent des obstacles techniques, notamment des plantages et des erreurs 1004 sur des fichiers volumineux (23000 lignes), des divergences entre ITEM_ID et CODE ARTICLE affectant les procédures VBA. Des propositions de modification des procédures et des tests avec des échantillons ont été discutées, et la discussion signale une amélioration potentielle mais sans confirmation finale.

Bobot (l’IA à votre service)
  1. Salut,
    je ne suis pas sur de bien comprendre si je comprend bien en gros:

    Tu veux ajouter une/plusieurs colonne(s) entre la 3eme et la 4eme c'est ça ?
    Si tel est le cas, cliques droit sur la colonne de droite et insertion
    Ex: Ajouter une colonne entre C et D, va sur D en haut cliques droit Insertion et D sera décalé en E, a cause de l'apparition d'un nouveau C

    Je sais pas si j'ai bien compris alors redis moi :)

    Bon courage
    0
    1. Bonsoir,
      Malheureusement ce n'est pas si simple. Mon fichier comprend 21150 lignes et environ 2640 doublons ou triplons... Alors il me faudrait 1 macro... et je maitrise pas suffisement VBA...
      0
    2. Ah ui d'accord je me doutais bien evidemment que c'était plus compliqué mais j'avai pas compris ça du tout... euh la honnetement je te conseille de voir avec raymond PENTIER ci dessous :)
      Bon Courage :)
      0
  2. Contributeur
    Il te faudrait une macro : tu t'y connais en VBA ?
    0
    1. Bonsoir les Antilles en Auvergne à Volvic il fait 3°.
      Je ne maitise pas VBA, je "bricole" .
      Mon fichier comprend 21150 lignes et environ 2640 doublons ou triplons... Alors il me faudrait 1 macro...
      0
    2. En faite je pense qu'avec une macro qui s'arrêterait sur la 2éme ligne de valeurs identiques, puis copirait les 2 cellules fabricant et réf. en se décalant de 2 colonnes sur la droite et remonterait d'1 ligne, puis effacerait cette ligne testée et reviendrait sur la 1 er cellule de la ligne complémenté, pour continer le test de doublon.
      Merci de votre aide..
      0
  3. Bonjour,
    Essayer de mettre un exemple avec une vingtaine de lignes (avec doublons ou triplons...) et sur la feuille 2, le résultat que vous souhaitez. Le mettre sur https://www.cjoint.com/ et poster le lien. Je regarderai ce qu'il est faisable !

    0
    1. Bonsoir
      J'espere que la manip à marchée.
      Merci de votre aide.
      0
      1. Bonjour,
        Il manque le lien qui a été créé .... Le copier et le coller sur le message... !

        0
        1. Bonjour,
          Merci pour le fichier.
          Si j'ai bien compris, vous voulez supprimer les lignes dont le [ITEM_ID] est en double, .... Est-ce bien cela ?

          0
          1. Bonjour,
            Essayer pour voir si cela vous convient.
            Votre exemple : https://www.cjoint.com/?3KDxldxctPE

            0
            1. Bonjour,
              Merci de votre aide.
              J'ai fais des petites macros avec excel 4. Maintenant c'est autres choses....
              Il me faut plus que la suppression des lignes de doublons, car ce qui fait la mutiplication des lignes des ITEM est en colonnes X, Y, et je veux inserer des colonnes pour concerver ces données en Z, AA, AB, AC, voir l'exemple.
              Cordialement
              0
          2. Bonjour,
            Libre à vous d'utiliser une autre méthode.
            et je veux inserer des colonnes pour concerver ces données en Z, AA, AB, AC
            C'est étonnant car mon code prend en compte les valeurs des colonnes selon la ligne des titres du tableau de base !

            Si vous voulez de l'aide, merci de mettre sur https://www.cjoint.com/ et poster le lien qui a été créé... !

            Salutations.
            Le Pingou
            0
            1. Re,
              Je me fais mal comprendre, dans l'onglet Brut, le code article 0111857 est dupliqué 3 fois, car en colonne X ce code article a 4 fabricants differents. Dans l'onglet Resultat j'ai inseré 3 colonnes FABRICANT et REF FABRICANT, Z, AA, AB, AC, AD, AE, pour copier ces info.

              Cordialement
              Louchadiere
              0
          3. Bonjour,
            Eh bien oui, j'ai repris le tout et j'ai constaté que cela m'avait échappé que vous vouliez conserver les valeurs [FABRICANT] et [REF FABRICANT] de la ligne supprimer et de les insérées dans la ligne unique.
            Ce n'est pas simple à réaliser car vous avez des doublons multiples (2, 3, 4, et plus).
            Merci de patienté ... dimanche oblige ...

            0
            1. Bonjour,
              La découverte est de la joie ça marche.
              Je vai tenté qlq. aménage car cette macro servira tout les mois.
              Merie beaucoup
              Louchadiere
              0
              1. Bonjour,
                Merci pour l'information.
                Un détail m'a échappé, pour tenir compte de la plage complète de la feuille [Brut] dans la macro [Sub Doublons() ],
                veuillez remplacer cette ligne :
                Sheets("Brut").[A1:AE1000].AdvancedFilter Action:=xlFilterCopy, _
                        CriteriaRange:=.[A1:A2], CopyToRange:=.[D1:F1], Unique:=True

                Par :
                 Sheets("Brut").Range("A1").CurrentRegion.AdvancedFilter _  Action:=xlFilterCopy, CriteriaRange:=.[A1:A2], _ CopyToRange:=.[D1:F1], Unique:=True


                0
                1. Bonjour,
                  Tous mes voeux pour cette nouvelle année et etc...
                  Je me sers de cette macro chaque début de mois.
                  J'ai rajouté le classement en grandissant des catalogues et des fournisseurs.
                  Juste un problème que je n'arrive pas à résoudre la 3iéme phase se passe bien (classement en ligne des doublons au dela du 4iéme), mais la 4iéme phase l'injection des fabricants et Réf. au dela du 4iéme ne marche pas.
                  En attendant votre aide je fais manuellement.
                  Aussi ne serait il pas possible de déterminer le N° de la derniere ligne des tableaux pour paramétrer la macro.
                  Merci de partager votre savoir
                  Louchadiere
                  0
              2. Bonjour,
                Avec tous mes voeux pour 2013, oui c'est possible, mais pour cela il faut des éléments précis .... !

                0
                1. Bonjour,
                  Si le code n'a pas été modifier, essayer dans la procédure [Sub insertfabr()] d'insérer en dessous [Set sh ....] cette ligne :
                   nbd = Range("nbmaxdbl")

                  Et la ligne après [With] doit-être :
                  .Columns("Z").Resize(, 2 * (nbd - 1)).Insert


                  0
                  1. Bonjour,
                    L'inscertion des 2 lignes d'instruction permet d'inscerer toutes les colonnes suivant Nb max Dbl, mais ne copie par les entête de colonne et les données correspondant.
                    Pourriez vous documenter chaques instruction, aici je pourrais peut être être autonome...
                    Merci

                    Sub SupDoublonsColB()
                    ' 1 Copie liste sans doublon dans résultat
                    Application.ScreenUpdating = False
                    Range("nbmaxdbl") = 0
                    Sheets("Resultat").Range("A1").CurrentRegion.Clear
                    Set sh = Sheets("Articles_PDR_Requête")
                    a = sh.Range("A1").CurrentRegion.Value
                    Set cbd = sh.Range("B1:B" & sh.Cells(Rows.Count, 1).End(xlUp).Row)
                    Dim c()
                    ReDim c(1 To UBound(a, 1), 1 To UBound(a, 2))
                    ligne = 1
                    Set mondico = CreateObject("Scripting.Dictionary")
                    For i = 1 To UBound(a)
                    If Not mondico.exists(a(i, 2)) Then
                    mondico.Add a(i, 2), 1
                    For k = 1 To UBound(a, 2): c(ligne, k) = a(i, k): Next k

                    nbd = WorksheetFunction.CountIf(cbd, a(i, 2))
                    If nbd > Range("nbmaxdbl") Then Range("nbmaxdbl") = nbd
                    ligne = ligne + 1
                    End If
                    Next
                    Sheets("Resultat").[A1].Resize(mondico.Count, UBound(c, 2)) = c
                    Set sh = Nothing
                    Set cbd = Nothing
                    Set mondico = Nothing
                    Application.ScreenUpdating = True
                    ' MsgBox "Voir feuille [Resultat]"
                    End Sub

                    Sub Doublons()
                    '2 Extraire les doublons, liste [ITEM_ID / FABRICANT / REF FABRICANT] dans TemDbl
                    Dim dl As Integer
                    With Sheets("TempDbl")
                    .Range("G2:P" & .Cells(Rows.Count, 4).End(xlUp).Row + 1).Clear
                    Sheets("Articles_PDR_Requête").Range("A1").CurrentRegion.AdvancedFilter Action:=xlFilterCopy, _
                    CriteriaRange:=.[A1:A2], CopyToRange:=.[D1:F1], Unique:=True

                    dl = .Cells(Rows.Count, 4).End(xlUp).Row
                    ' format nombre pour colonne [ITEM_ID]
                    .Range("A3") = 1
                    .Range("A3").Copy
                    .Range("D2:D" & dl).PasteSpecial Paste:=xlPasteAll, Operation:=xlMultiply, _
                    SkipBlanks:=False, Transpose:=False
                    .Range("A3").Clear
                    .Columns("D:F").Sort Key1:=.Columns("D"), Order1:=xlAscending, Header:=xlGuess
                    End With

                    'Classer ITEM_ID & FABBRICANT
                    Range("d1").Select
                    Selection.End(xlDown).Select
                    Cells(ActiveCell.Row, "F").Select
                    ActiveWorkbook.Names.Add Name:="fin_colon_F", RefersToR1C1:=Selection
                    Range("D1:fin_colon_F").Select
                    Columns("D:F").Select
                    ActiveWorkbook.Worksheets("TempDbl").Sort.SortFields.Clear
                    ActiveWorkbook.Worksheets("TempDbl").Sort.SortFields.Add Key:=Columns("D") _
                    , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                    ActiveWorkbook.Worksheets("TempDbl").Sort.SortFields.Add Key:=Columns("E") _
                    , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                    With ActiveWorkbook.Worksheets("TempDbl").Sort
                    .SetRange Range("D1:fin_colon_F")
                    .Header = xlYes
                    .MatchCase = False
                    .Orientation = xlTopToBottom
                    .SortMethod = xlPinYin
                    .Apply
                    End With
                    Columns("D:F").EntireColumn.AutoFit

                    End Sub

                    Sub recupfabrefsupdoub()
                    '3 Range fabricant et réf par articles dans TempDbl
                    With Sheets("TempDbl")
                    nbd = Range("nbmaxdbl")
                    For c = .Cells(Rows.Count, 4).End(xlUp).Row To 2 Step -1
                    If .Cells(c, "D") = .Cells(c, "D").Offset(-1, 0) Then
                    ' MsgBox "doublons : " & Cells(c, "D")
                    .Range(.Cells(c, 5), .Cells(c, 5 + (nbd * 2) - 1)).Copy Destination:=.Cells(c, "g").Offset(-1, 0)
                    .Rows(c).Delete
                    End If
                    Next c
                    End With
                    Columns("D:AK").EntireColumn.AutoFit
                    End Sub

                    Sub insertfabr()
                    '4 Injecte les divers fabricants et réf dans Resultat
                    Set sh = Sheets("TempDbl")
                    nbd = Range("nbmaxdbl")

                    With Sheets("Resultat")
                    '.Columns("Z").Resize(, 2 * (6).Insert
                    .Columns("Z").Resize(, 2 * (nbd - 1)).Insert

                    sh.Range(sh.Cells(1, 7), sh.Cells(1, 12)).Copy Destination:=.Cells(1, "Z")
                    For c = 2 To sh.Cells(Rows.Count, 5).End(xlUp).Row
                    nuli = WorksheetFunction.Match(sh.Cells(c, 4), .Range("B:B"), False)
                    sh.Range(sh.Cells(c, 5), sh.Cells(c, 12)).Copy Destination:=.Cells(nuli, "X")
                    Next c
                    End With
                    Columns("x:AF").EntireColumn.AutoFit
                    Range("A1").Select
                    ActiveWindow.SplitRow = 0.705882352941177
                    Selection.AutoFilter
                    End Sub
                    0
                2. Bonsoir,
                  Merci pour les explications.
                  Sur un fichier de 23000 lignes, la macro ** insérer les lignes sans doublons
                  bloque à la l'instruction Sheets("Resultat").[A1].Resize(mondico.Count, UBound(c, 2)) = c
                  peut être un problème de mèmoire.
                  Y a t'il une solution.
                  0
                  1. Bonjour,
                    Qu'elle est le message d'erreur exact !

                    0
                    1. Suite,
                      Erreur d'execution 1004
                      Erreur défini par l'application ou l'objet
                      Pointé suivant l'instruction
                      ** insérer les lignes sans doublons
                      Sheets("Resultat").[A1].Resize(mondico.Count, UBound(c, 2)) = c
                      Cordialement
                      0
                      1. Bonjour,
                        Merci, oui effectivement il y a un problème avec un si grand nombre de lignes (23000 de 30 colonnes).
                        Pour l'instant je n'ai pas de solution sans faire un test.
                        Réponse pas avant mardi à moins qu'une autre personne intervienne... !i

                        0
                        • 1
                        • 2