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
    ** 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. 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
      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. 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. 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...
        2. 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
        3. 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
            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. 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
                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. 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
                    Bonjour,
                    Manque juste le "classeur fournit en annexe" :-)
                    Tu peu le poster sur Cjoint.fr et mettre le lien dans un poste suivant.
                    A+