RechercheV données multiples VBA

Résolu
Bonjour,

Je souhaiterais qu'on m'aide sur un problème que je rencontre pour une création de fichier.

J'aimerais que lorsque la cellule C4 de la feuille "Exemple (2)" soit remplie par un code produit, la macro aille rechercher cette valeur dans la table de la feuille "Table_recette" pour me l'inscrire dans le tableau de la feuille "Exemple (2)".
Jusqu'ici, pas de problème, SAUF que, comme vous pourrez le constater sur mon classeur fourni en annexe, pour un même n° il y a plusieurs articles avec des quantités différentes et il y a 5500 lignes à analyser.

De plus, je n'arrive pas à colorier les cellules comme dans l'exemple en fonction de l'article (ex: PAI = marron, PDM = bleu, VIA = rouge...)

Quelqu'un à une idée pour réaliser cette macro?

Rq : Seul les articles commencant par PAI, VIA, PDM, SAU, PRE, BOF et LEG m'intéressent.

13 réponses

Résumé de la discussion

Le sujet concerne une macro Excel qui, lorsque C4 sur la feuille Exemple (2) reçoit un code produit, cherche ce code dans Table_recette et inscrit le résultat dans le tableau associé. Le problème inclut plusieurs articles portant le même numéro avec des quantités différentes et un volume de 5500 lignes, ainsi que le besoin de colorier les cellules selon l'article (PAI, VIA, PDM, etc.). La proposition principale détaille une macro Cherche qui parcourt Table_recette et réécrit les résultats sur la feuille Exemple (2), en associant les colonnes et en appliquant des couleurs selon PAI, VIA, PDM, et autres.

Bobot (l’IA à votre service)
  1. Contributeur
    Bonjour,
    Manque juste le "classeur fournit en annexe" :-)
    Tu peu le poster sur Cjoint.fr et mettre le lien dans un poste suivant.
    A+
    1. Contributeur
      Oui, j'ai ton classeur.
      Dans le feuille2 tu veux avoir..
      Toutes les lignes qui corresponde au code taper ?
      Quel sont les cellules qu'il faut copier ? uniquement colonne B ou de A à H
      Le code est entrer en entier ? BOF00500 ou seulement BOF ?
      Et pour les couleurs je ne comprend pas.
      Tu dis.
      Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
      NOTE : Je ne répond pas aux MP pour les questions techniques.
      1. Contributeur
        Un premier jet..
        Dans le module de la feuille Exemple coller le code suivant.
        Private Sub Worksheet_Change(ByVal Target As Range)
        Dim Lig As Long, B As Boolean
        Dim LigC As Long
            If Target.Count > 1 Then Exit Sub
            If Target.Address = "$B$4" Then
                Application.EnableEvents = False
                Range("C4:H" & [C4].End(xlDown).Row).Clear
                LigC = 4
                With Sheets("Table_recette")
                    For Lig = 2 To .[A10000].End(xlUp).Row
                        If .Cells(Lig, 1) = Target Then
                            B = True
                            .Range(.Cells(Lig, 1), .Cells(Lig, 8)).Copy Cells(LigC, 3)
                            LigC = LigC + 1
                        ElseIf B = True Then
                            Exit For
                        End If
                    Next Lig
                End With
            End If
            Application.EnableEvents = True
        End Sub

        Taper un code (complet genre BOF00500) dans la case B4 de la feuille Exemple et taper Enter
        Tu dis.
        1. Ce qu'il me faut c'est que dans la cellule D50 de la feuille "Exemple (2)", si mon produit contient du PAI, il affiche le PAI*****, puis dans la case suivante, si mon produit contient du PDM, il affiche le PDM*****, puis dans la case suivante,... mais si il n'a pas de produit LEG, il continue.
          .. etc
          Puis il renseigne la quantité de la matière en D55 (attention, une même matière peut avoir des quantité différentes...)

          Dans la feuille table_recette, seules les colonnes A, B et H m'intéressent.

          Ensuite, pour les couleurs, si la case D50 est PAI, il prend la couleur marron ainsi que la cellule d'en dessous; si c'est PDM, il devient bleu...

          C'est plus clair?
          1. Contributeur
            C'est plus clair?
            Beh non, je comprend plus rien.
            Et mettre les données à chercher plus haut aurait été plus simple.
            Pourquoi "cacher" ces cellules si bas ?
            Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
            NOTE : Je ne répond pas aux MP pour les questions techniques.
            1. Lol,

              Je recommence:
              - dans la feuille "Exemple (2)",en C4, j'écris un code produit (ex: 1151 ou 1597 ou...)
              - quand C4 est remplie, alors la macro va chercher le code produit dans la table de la feuille "Table_recette"
              - puis elle écrit chaque article qu'elle trouve dans une cellule de la feuille "Exemple (2)" dans D50:H50
              - ensuite, si D50 est rempli, elle lit le début du mot (ex: PAI*****) et affecte une couleur de remplissage à cette cellule ainsi qu'à celle du dessous (qui est vide).
              - enfin, elle va chercher la valeur (quantité) de l'article (ex: PAI05100=0.012) et la copie dans la cellule D55 de la feuille "Exemple (2)"

              C'est mieux?
              1. Contributeur
                Non,
                Donne un exemple concret.. et pas des.. par exemple
                En C4 mettre le code xxxx (QUI EXISTE VRAIMENT DANS TA LISTE)
                En D50 il faut trouver xxxx le résultat réel, idem pour les autres cellule de la ligne 50 de exemple2
                le code que tu met en C4, se retrouve dans la colonne A ou la colonne B.
                Tout est mélanger dans ta table, des produits à la place des quantités, des PAIxx.. dans différentes colonnes, etc.. et je parviens pas à m'y retrouver.
                1. En faite, c'est exactement l'exemple que je te joint en annexe...

                  https://www.cjoint.com/?0LvjOJIp1CD

                  Rq: la recherche doit commencer au BOF***** pas avant les 7 premières lignes.
                  le code en C4 est celui de la colonne B (Code_A)
                  je sais qu'il y a des PRE**** dans la colonne B mais il ne faut pas que la macro en tienne compte.

                  Je sais que c'est un peu compliqué, c'est pour ça que j'ai besoin d'aide ;-)
                  Merci de ta patience lermite222
                2. Contributeur
                  Ça y est, j'ai compris, reste juste une dernière mise au point.
                  Certain filtre donne moins de 5 résultats, c'est juste ?
                  Le maximum de résultats est 5. C'est exact ?
                  Ça ne commence pas toujours par PAI, ça peut être dans le désordre (ou non)
                  A part ça, pas de problème pour coder une tite fonction.
                3. Par contre, est ce que c'est possible d'avoir que les PAI, SAU, VIA, PDM, BOF, PRE et LEG (et pas les FIL, E, CART...) et dans cet ordre?
                  De plus est ce que c'est également possible d'avoir une couleur précise pour chaque ingrédient?
                  - PAI = marron
                  - SAU = jaune clair
                  - PDM = bleu turquoise
                  - BOF = orange "or"
                  - PRE = violet clair
                  - LEG = vert citron
                  - VIA = rose

                  Par contre, le maximum, n'est pas 5 mais 8, mais bon, c'est de la mise en page ça après...

                  Merci
                4. Contributeur
                  Les mettre dans l'ordre complique très fort le code (mais possible)
                  les couleurs.. pas de problème
                  Sur un classeur xls pas moyen d'avoir les couleurs d'Excel 2007, j'adapte en conséquence.
                  Si j'ai fini avant midi je te poste le code sinon ce sera pour après 17hr
                5. Ok, merci lermite222.

                  @+
                  Pookie
              2. Contributeur
                dans le module de la feuille exemple tu colle le code..
                Private Sub Worksheet_Change(ByVal Target As Range)
                    If Target.Address = "$B$4" Then
                        Application.EnableEvents = False
                        Cherche Target.Value
                        Application.EnableEvents = True
                    End If
                End Sub

                Et dans un module général tu copie..
                Sub Cherche(Filtre As String)
                Dim Lig As Long, Col As Integer, Coul As Integer
                Dim Wks As Worksheet
                
                    Set Wks = Sheets("Exemple (2)")
                    'Vider le tableau
                    Wks.[D50:K52].Interior.ColorIndex = xlNone
                    Wks.[D50:K50].ClearContents
                    Wks.[D55:K56].ClearContents
                    Col = 4
                    With Sheets("Table_recette")
                    For Lig = 9 To .[B65536].End(xlUp).Row
                        If .Cells(Lig, "B") = Filtre Then
                            Wks.Cells(50, Col) = .Cells(Lig, "A")
                            Wks.Cells(55, Col) = .Cells(Lig, "D")
                            Select Case Left(Wks.Cells(50, Col), 3)
                            Case "PAI": Coul = 53 'marron
                            Case "SAU": Coul = 36 'jaune clair
                            Case "PDM": Coul = 5  'bleu
                            Case "BOF": Coul = 45 'orange
                            Case "PRE": Coul = 39 'violet
                            Case "LEG": Coul = 43 'vert
                            Case "VIA": Coul = 40 'rose
                            End Select
                            Wks.Range(Cells(50, Col), Cells(52, Col)).Interior.ColorIndex = Coul
                            Col = Col + 1
                        End If
                    Next Lig
                    End With
                End Sub

                Juste l'ordre n'est pas respecté.
                Si absolument nécessaire tu dis, j'envisagerais de modifier.
                A+
                1. Contributeur
                  Finalement... avec tri des résultats..
                  Sub Cherche(Filtre As String)
                  Dim Lig As Long, Col As Integer, Coul As Integer
                  Dim Wks As Worksheet
                  Dim P, C
                  Dim S As Integer
                      P = Array("PAI", "SAU", "PDM", "BOF", "PRE", "LEG", "VIA")
                      C = Array(53, 36, 5, 45, 39, 43, 40)
                      Set Wks = Sheets("Exemple (2)")
                      'Vider le tableau
                      Wks.[D50:K52].Interior.ColorIndex = xlNone
                      Wks.[D50:K50].ClearContents
                      Wks.[D55:K56].ClearContents
                      Col = 4
                      With Sheets("Table_recette")
                      For S = 0 To 6
                              For Lig = 9 To .[B65536].End(xlUp).Row
                             ' If .Cells(Lig, "B") = Filtre Then Stop
                                  If .Cells(Lig, "B") = Filtre And Left(.Cells(Lig, "A"), 3) = P(S) Then
                                      Wks.Cells(50, Col) = .Cells(Lig, "A")
                                      Wks.Cells(55, Col) = .Cells(Lig, "D")
                                      Wks.Range(Cells(50, Col), Cells(52, Col)).Interior.ColorIndex = C(S)
                                      Col = Col + 1
                                  End If
                              Next Lig
                          Next S
                      End With
                  End Sub

                  A+
                  1. Heu désolé lermite222, mais j'arrive plus trop à te suivre... lol
                    Tu peux m'expliquer le code stp???

                    Merci,
                    Pookie
                    1. Contributeur
                      C'est le même que le précédant sauf que l'ont passe 6 fois en revue les données en commençant par PAI..SAU.. etc. Ainsi les données sont dans l'ordre que tu souhaitait.
                      Dans un premier temps, colle le code ci-dessus et fais un essais.
                      Ensuite pour comprendre tu peu faire un pas à pas en mettant des point d'arrêt sur le code
                       Wks.Cells(50, Col) = .Cells(Lig, "A")

                      Clic sur la marge gauche en regard de cette ligne, elle va se colorer en brun.
                      Lance la macro en mettant un filtre dans la cellule B4. et tape ENTER
                      ATTENTION, Taper 2 fois le même code ne change rien.
                      Bien entendu, tu a copier la première sub dans le module de la feuille ?
                      Sinon, à gauche de l'éditeur de macro tu a la fenêtre des projets, (si pas visible Ctrl+R)
                      Dans cette fenêtre tu à le nom de tes feuilles, double clic sur la feuille exemple et c'est sur cette fenêtre que tu doit copier
                      Private Sub Worksheet_Change(ByVal Target As Range) 
                          If Target.Address = "$B$4" Then 
                              Application.EnableEvents = False 
                              Cherche Target.Value 
                              Application.EnableEvents = True 
                          End If 
                      End Sub

                      Cette sub réagit à la modification d'une cellule.
                      C'est mon tour de dire.. C'est plus clair ? :-)
                      Edit: tu peu supprimer la ligne,
                      ' If .Cells(Lig, "B") = Filtre Then Stop

                      Elle m'a servit pour la mise au point.
                    2. pijaku : oui, je m'en doute mais comme le premier qui m'avait répondu sur l'autre, m'a dit que c'était pas un "macro"titien. Donc j'ai mis mon problème en programmation...
                      Désolé, je referai pas.
                    3. lermite222 : bon soit je suis très c** (ce qui est possible), soit ça ne fonctionne pas...
                      :'(
                    4. Contributeur
                      Bonjour Pijaku,
                      Effectivement c'est un fameux doublon, Les mêmes questions posées, les réponses copiées/collées et le suivi des 2 en temps réel.
                      Merci de l'avoir signaler.
                      De mon côté, abandon du suivi. Peut-être un peu tard.
                      A+
                  2. Contributeur
                    ** Mais non, mais non. :-)
                    Y fonctionne, mais oui, mais oui!
                    Ton classeur en retour
                    Tu dis.
                    A+
                    Si tu te cognes à un pot et que ça sonne creux, c'est pas forcément le pot qui est vide. ;-)(Confucius)
                    NOTE : Je ne répond pas aux MP pour les questions techniques.
                    1. Bonjour GautCookie,

                      si j'ai bien compris, tu veux :

                      - taper ton numéro de recette en Exemple2.C4
                      - dans la bonne colonne, ligne 50, le PAI, le PDM, le SAU, et les 2 LEG qui il te faut pour la préparer. (quand ils existent pour cette recette)
                      - les quantités correspondante dans la même colonne mais ligne 55.

                      Et accessoirement, que PAI, PDM, SAU et LEG soit toujours présentés dans le même ordre de droite à gauche et colorés dans Exemple2 ?
                      1. Contributeur
                        Salut, T'arrive comme Dartaban toi, quand la bataille est finie et qu'il n'y a plus qu'à ramasser les trophées.
                        Et il me semblais que tu ne téléchargeais JAMAIS SUR UN FORUM
                      2. Salut,

                        j'essaie juste de comprendre en vue d'éventuellement donner un coup de main.

                        Je ne vois aucun trophée à récolter ici. Surtout que ce n'était pas compliqué à comprendre du premier coup...

                        Je n'ai pas souvenir de t'avoir offensé pour que tu m'apostrophe ainsi en publique...