RechercheV données multiples VBA

Résolu
GautPookie Messages postés 29 Statut Membre -  
GautPookie Messages postés 29 Statut Membre -
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

  1. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Bonjour,
    Manque juste le "classeur fournit en annexe" :-)
    Tu peu le poster sur Cjoint.fr et mettre le lien dans un poste suivant.
    A+
    0
  2. GautPookie Messages postés 29 Statut Membre
     
    Re, Oups, effectivement.
    Je suis décidemment pas très doué avec l'informatique... lol

    Voici le lien : https://www.cjoint.com/?0Lum5HjVIKP

    Dis moi si ça fonctionne bien.

    Merci lermite222
    0
  3. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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.
    0
  4. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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.
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. GautPookie Messages postés 29 Statut Membre
     
    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?
    0
  7. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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.
    0
  8. GautPookie Messages postés 29 Statut Membre
     
    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?
    0
  9. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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.
    0
    1. GautPookie Messages postés 29 Statut Membre
       
      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
      0
    2. lermite222 Messages postés 9042 Statut Contributeur 1 199
       
      Ç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.
      0
    3. GautPookie Messages postés 29 Statut Membre
       
      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
      0
    4. lermite222 Messages postés 9042 Statut Contributeur 1 199
       
      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
      0
    5. GautPookie Messages postés 29 Statut Membre
       
      Ok, merci lermite222.

      @+
      Pookie
      0
  10. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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+
    0
  11. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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+
    0
  12. GautPookie Messages postés 29 Statut Membre
     
    Heu désolé lermite222, mais j'arrive plus trop à te suivre... lol
    Tu peux m'expliquer le code stp???

    Merci,
    Pookie
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Bonjour,
      Salut Lermitte222,
      Petit rappel @ GautPookie : les doublons sont interdits par la charte de ce site.
      Merci d'en tenir compte à l'avenir...
      0
    2. lermite222 Messages postés 9042 Statut Contributeur 1 199
       
      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.
      0
    3. GautPookie Messages postés 29 Statut Membre
       
      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.
      0
    4. GautPookie Messages postés 29 Statut Membre
       
      lermite222 : bon soit je suis très c** (ce qui est possible), soit ça ne fonctionne pas...
      :'(
      0
    5. lermite222 Messages postés 9042 Statut Contributeur 1 199
       
      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+
      0
  13. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    ** 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.
    0
  14. Phoenellion Messages postés 131 Statut Membre 33
     
    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 ?
    -2
    1. lermite222 Messages postés 9042 Statut Contributeur 1 199
       
      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
      0
    2. Phoenellion Messages postés 131 Statut Membre 33
       
      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...
      0