Fonction recherche ? macro ?

Bonjour, bonjour,

Je travaille sur un fichier avec plus de 50 colonnes et plus de 400 lignes.

Je vous mets en pièce jointe un mini extrait pour comprendre le principe de mon fichier (onglet données)

Dans mon onglet "TRAME", on retrouve par une liste en cascade + fonction INDIRECT + fonction rechercheV, les caractéristiques de chaque référence.

Et j'aimerais que dans la partie gauche du tableau (en dessous d'ingrédients), on retrouve automatiquement tous les intitulés des ingrédients ayant une valeur >0 pour la référence citée en B14.

Et dans la partie droite du même tableau la valeur correspondante. (exemple : Sel 1g)

Je ne peux pas faire de rechercheV pour chaque ingrédient car je ne veux pas que les ingrédients qui ne sont pas présents dans le produit se retrouvent dans mon tableau (car dans ma vraie version je me retrouverais avec 30 références dont 20 à 0)

Auriez-vous une piste ?

Je ne sais pas si je suis très claire...

PS: je n'ai jamais fait de macro

Clem

Salut Cleim!

Tu trouveras ci-joint ton fichier modifié avec les codes ci-dessous :

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Application.Intersect(Target, Cells(13, 2)) Is Nothing Then Call List
If Not Application.Intersect(Target, Cells(14, 2)) Is Nothing Then Call List
End Sub
Sub List()
Dim Réf As String
Dim x As Long, y As Long, z As Long
Range("B26:C1000").ClearContents
Réf = Sheets("TRAME").Cells(13, 2) & Sheets("TRAME").Cells(14, 2)
For x = 2 To Sheets("Données").Range("A" & Rows.Count).End(xlUp).Row
    If Sheets("Données").Cells(x, 2) & Sheets("Données").Cells(x, 1) = Réf Then
        For y = 6 To Sheets("Données").Cells(x, 10000).End(xlToLeft).Column
            If Sheets("Données").Cells(x, y) > 0 Then
                z = Range("B" & Rows.Count).End(xlUp).Row + 1
                If z = 24 Then z = 26
                Sheets("TRAME").Cells(z, 2) = Sheets("Données").Cells(1, y)
                Sheets("TRAME").Cells(z, 3) = Sheets("Données").Cells(x, y)
            End If
        Next
    End If
Next
End Sub

Pour "activer" la procédure (ou macro) tu a juste besoin de changer de client ou d'intitulé du produit (tes cellules B13 et B14 de la feuille TRAME).

La recherche ce fait automatiquement dans la feuille Donnée et ne prend pas en compte les colonnes qui sont égales à zéro

Je te laisse essayer et tu reviens vers nous ;D

9pour-clem.xlsm (45.39 Ko)

Merci pour ton aide Juice

Je vais essayer tout ça !

C’est pile ce que je voulais 👍 merci

J’essaye de l’adapter à mon fichier 😊

Par contre la base de donnée que j’utilise se trouve dans un autre classeur.

Du coup j’ai essayé de remplacer les termes : Sheets(«Données ») par Workbooks(« nom du classeur »).Sheets(« nom de la feuille »)

En suivant bien le reste mais ça ne fonctionne pas ... on ne peut aller chercher des données dans un autre classeur ?

Clem

Re- Clem

Par contre la base de donnée que j’utilise se trouve dans un autre classeur.

Du coup j’ai essayé de remplacer les termes : Sheets(«Données ») par Workbooks(« nom du classeur »).Sheets(« nom de la feuille »)

En suivant bien le reste mais ça ne fonctionne pas ... on ne peut aller chercher des données dans un autre classeur ?

C'est la bonne méthode pourtant :0

Mais il faut que le classeur avec les sources soit ouvert et que l'extension du fichier soit correctement indiqué dans le Workbooks (par exemple .xls .xlsx .xlsm)

Avec le code ci-dessous, sa a fonctionné chez moi :

Sub List()
Dim Réf As String
Dim x As Long, y As Long, z As Long
Range("B26:C1000").ClearContents
Réf = Sheets("TRAME").Cells(13, 2) & Sheets("TRAME").Cells(14, 2)
For x = 2 To Workbooks("Pour Clem(2).xlsx").Sheets("Feuil1").Range("A" & Rows.Count).End(xlUp).Row
    If Workbooks("Pour Clem(2).xlsx").Sheets("Feuil1").Cells(x, 2) & Workbooks("Pour Clem(2).xlsx").Sheets("Feuil1").Cells(x, 1) = Réf Then
        For y = 6 To Workbooks("Pour Clem(2).xlsx").Sheets("Feuil1").Cells(x, 10000).End(xlToLeft).Column
            If Workbooks("Pour Clem(2).xlsx").Sheets("Feuil1").Cells(x, y) > 0 Then
                z = Range("B" & Rows.Count).End(xlUp).Row + 1
                If z = 24 Then z = 26
                Sheets("TRAME").Cells(z, 2) = Workbooks("Pour Clem(2).xlsx").Sheets("Feuil1").Cells(1, y)
                Sheets("TRAME").Cells(z, 3) = Workbooks("Pour Clem(2).xlsx").Sheets("Feuil1").Cells(x, y)
            End If
        Next
    End If
Next
End Sub

Restant à dispo

Oui c'est bon ça fonctionne en mettant les sources et les extensions merci

Par contre je ne comprends la ligne de code suivante :

z = Range("B" & Rows.Count).End(xlUp).Row + 1

If z = 24 Then z = 26

Pourrais-tu me l'expliquer stp ?

Re- Clem

Ces lignes [...]

z = Range("B" & Rows.Count).End(xlUp).Row + 1
If z = 24 Then z = 26

[...] permettent de connaître la ligne de destination où doit être mis le résultat de la recherche.

En effet, le code [...]

Range("B" & Rows.Count).End(xlUp).Row + 1

[...] renvoie le numéro de la dernière ligne non vide de la colonne B, résultat auquel tu rajoute le +1 pour dire que tu souhaite aller une ligne en dessous (sinon tu écrit par dessus ta ligne non vide).

Si j'ai dû utiliser [...]

If z = 24 Then z = 26

[...] c'est parce que le premier résultat était 24 (une ligne qui est en dehors du tableau où doivent être mis les résultats). Donc pour gérer cette erreur, tu dit à ton code que si z te renvoie la ligne 24, alors tu veux aller à la ligne 26

Une fois que ton code a écrit dans la ligne 26, il écrira ensuite dans la dernière ligne non vide + 1 (soit 26 + 1 = 27) etc...

En espérant que c'est plus clair

Restant à ta dispo!

C'est très clair Juice ! Merci

Et si je veux dire que mes résultats >0 soient mis de C30 à C44 (z=2) et le nom du produit de B30 à B44 (z=3) (car parmi mes 50 ingrédients il y en aura max 15 qui seront >0) et ensuite en dessous des ingrédients je dois mettre mon type de palettisation.

Et si je comprends bien ton code, si je mets des infos après il considérera que les cellules sont non vides et mettra alors ma liste d'ingrédients après ma palettisation ?

Clem

Re ^^

J'ai eu un flash Si je mets If z=65 (Dernière ligne non vide) Then z=30

C'est bon non ?

Re- Clem,

Si tu souhaite que ta première ligne où doivent être mis les résultats soit la ligne 30, alors je te propose le code ci-dessous :

z = Range("B" & Rows.Count).End(xlUp).Row + 1
If z < 30 Then z = 30

Comment tu a fais pour obtenir ce résultat :0

Si je mets If z=65 (Dernière ligne non vide) Then z=30

Restant à ta dispo

Alors pourquoi ce résultat :

Si je mets If z=65 (Dernière ligne non vide) Then z=30

parce que je sais que ma dernière ligne non vide sera tout le temps la 65, il y aura jamais rien après et il y aura tout le temps quelque chose dans la cellule B65.

Mon raisonnement était peut-être pas bon...

Ensuite, j'ai un soucis puisque ça ne fonctionne pas...

Je veux qu'il aille me chercher les ingrédients >0 de la colonne 30 à la colonne 77, du coup j'ai pensé à ce code :

For y = 30 To Workbooks("Base Mère.xlsm").Worksheets("Base Qualité").Cells(x, 77)

Comme au départ tu m'avais proposé le code suivant :

For y = 6 To Workbooks("Pour Clem(2).xlsx").Sheets("Feuil1").Cells(x, 10000).End(xlToLeft).Column

Mais ça ne fonctionne pas ...

Clem

Re- Clem,

Pour ton problème de recherche de la colonne 30 à la colonne 77 tu peux remplacer mon code part :

For y = 30 To 77

Ensuite :

Alors pourquoi ce résultat :

Si je mets If z=65 (Dernière ligne non vide) Then z=30

parce que je sais que ma dernière ligne non vide sera tout le temps la 65, il y aura jamais rien après et il y aura tout le temps quelque chose dans la cellule B65.

Mon raisonnement était peut-être pas bon...

Mais du coup, le code que tu a écrit est bon ou tu a un problème avec sa aussi :0 ?

Restant à ta dispo

Avec mon code ça ne fait rien du tout ... j'ai sûrement loupé un truc quelque part comme c'est ma première macro...

Je commence à comprendre certaines choses mais il me manque sûrement des bases "simple"

Pour le code que tu me proposes, j'ai une erreur en rouge :

For y = 30 To 77 To Workbooks("Base Mère.xlsm").Worksheets("Base Qualité")

Je ne sais pas où et comment placer mon classeur "Base Mère"...

Re- Clem,

C'est déjà bien que tu essaye de comprendre sans faire un bête copier / coller ;D !

Avec mon code ça ne fait rien du tout ... j'ai sûrement loupé un truc quelque part comme c'est ma première macro...

Je commence à comprendre certaines choses mais il me manque sûrement des bases "simple"

Pour le code que tu me proposes, j'ai une erreur en rouge :

For y = 30 To 77 To Workbooks("Base Mère.xlsm").Worksheets("Base Qualité")

Je ne sais pas où et comment placer mon classeur "Base Mère"...

Attention, je t'avais dit de mettre :

For y = 30 To 77 

Enlève le To Workbooks("Base Mère.xlsm").Worksheets que tu a mis à la suite :p

Ensuite, comment tu ne sais pas comment placer ton classeur "Base mère" :p ?

Tu veux dire comment y faire référence dans ton code pour aller récup les données ?

Ce serait plus cool que tu me mette la copie de tout le code avec ce que tu recherche à faire ^^

Je pourrais voir tout de suite où sa coince et t'expliquer le pourquoi

Restant à ta dispo !

Re Juice,

Alors je t'ai mis ma macro avec les commentaires de ma tête ^^

Je sais pas si c'est très clair mais tu comprendras peut-être mieux mes erreurs et ce que je veux avec ma vraie version.

Merci de ton aide !

Clem

Private Sub Worksheet_Change(ByVal Target As Range)
'Donc là je veux que la macro se déclenche lorsque je modifie mes cellules depuis la liste déroulante'
If Not Application.Intersect(Target, Cells(13, 2)) Is Nothing Then Call Jus
If Not Application.Intersect(Target, Cells(14, 2)) Is Nothing Then Call Jus
If Not Application.Intersect(Target, Cells(15, 2)) Is Nothing Then Call Jus
End Sub
Sub Jus()
Dim Réf As String
Dim x As Long, y As Long, z As Long
'Là ma plage de cellules appelé Tableau_jus (cellules B30:C44) se vide lorsque je modifie ma liste déroulante'
Range("Tableau_jus").ClearContents

'Ici Réf correspond aux cellules B15, B14 et B13'
Réf = Sheets("TRAME").Cells(13, 2) & Sheets("TRAME").Cells(14, 2) & Sheets("TRAME").Cells(15, 2)

'Donc là je veux que ça aille chercher ma "Réf" dans ma base, que cette recherche commence à partir de la ligne 5 jusqu'en bas et de la colonne A à G.'
For x = 5 To Workbooks("Base Mère.xlsm").Worksheets("Base Qualité").Range("A" & Rows.Count).End(xlUp).Row
'Là dans ma recherche si mes colonnes C, F et G correspondent à ma "Réf". ma recherche se stoppe sur la ligne correspondante.'
    If Workbooks("Base Mère.xlsm").Worksheets("Base Qualité").Cells(x, 3) & Workbooks("Base Mère.xlsm").Worksheets("Base Qualité").Cells(x, 6) & Workbooks("Base Mère.xlsm").Worksheets("Base Qualité").Cells(x, 7) = Réf Then

        'Lorsque ma recherche a trouvé la ligne correspondant à ma "Réf", je veux que tous les ingrédients >0 allant de la colonne AD à BY se mettent dans ma plage appelée Tableau_jus (B30:C44). Et que les noms d'ingrédients se trouvant sur la 4 de ma base se mettent dans la colonne B (ou 2 en langage vba ?) de ma feuille TRAME et que la quantité d'ingrédients associée se mette dans la colonne C de ma feuilles TRAME.'
        For y = 30 To 77
            If Workbooks("Base Mère.xlsm").Worksheets("Base Qualité").Cells(x, y) > 0 Then
                z = Range("B" & Rows.Count).End(xlUp).Row + 1
                If z = 65 Then z = 30
                Sheets("TRAME").Cells(z, 2) = Workbooks("Base Mère.xlsm").Worksheets("Base Qualité").Cells(4, y)
                Sheets("TRAME").Cells(z, 3) = Workbooks("Base Mère.xlsm").Worksheets("Base Qualité").Cells(x, y)
            End If
        Next
    End If
Next
End Sub

'Voilà, je ne sais pas trop si c'est clair. Par contre mes recherches se font toutes dans ma base qui se trouve dans un autre classeur, d'où ma recherche allant de 30 à 77 dans le classeur Base Mère.'

Re- Clem,

Désolé pour la lenteur de mon retour :p

Bon j'ai regardé ton code dans son ensemble, et je ne vois pas d'erreur (T'a l'air d'avoir bien saisi la logique de cette procédure!)

Donc bon, j'aurais bien aimé procéder à des test pour voir où sa pourrait buger mais vue que les références et la disposition des tableaux ont changées, il me faudrait une copie des nouvelles versions

(Fichier Trame & Base Mère)

Restant à ta dispo!

Pas de soucis

Je te mets en pièce jointe les fichiers.

Merci

Clem

Re-

Merci pour ton retour !

Une question, dans ta feuille TRAME les cellules Clients, Intitulé du produit et Origine matière première doivent matcher avec quelles colonne de ta feuille BASE QUALITÉ :p ?

Parce que là il y a beaucoup de colonne dans la BASE QUALITÉ qui se ressemblent x)

Il est vrai ^^

Alors Clients --> colonne F (6)

Intitulé du produit --> colonne C (3)

Origine MP --> colonne G (7)

Voilà

Re- Clem,

Super! J'ai pu tester ton code est relever quelque erreur du coup :

Réf = Sheets("TRAME").Cells(13, 2) & Sheets("TRAME").Cells(14, 2) & Sheets("TRAME").Cells(15, 2)

et

If Workbooks("Base Mère.xlsm").Worksheets("Base Qualité").Cells(x, 3) & Workbooks("Base Mère.xlsm").Worksheets("Base Qualité").Cells(x, 6) & Workbooks("Base Mère.xlsm").Worksheets("Base Qualité").Cells(x, 7) = Réf Then

En gros tu dit que ta Réf est égal à : Client & Intitulé Produit & Origine MP

Et tu dit que tu veux le comparer à : Intitulé Produit & Client & Origine MP

Les deux références sont pas ranger dans le même ordre, donc sa te trouvais aucun résultat

Ensuite :

If z = 65 Then z = 30

Pour la première utilisation, ton z est pas égal à 65 mais à 66. Donc vue que la condition SI n'est pas respectée, tes résultats sortent à partir de la ligne 66 !

Voilà

Ci-dessous ton code modifié :

Sub Jus()
Dim Réf As String
Dim x As Long, y As Long, z As Long
Range("Tableau_jus").ClearContents
Réf = Sheets("TRAME").Cells(14, 2) & Sheets("TRAME").Cells(13, 2) & Sheets("TRAME").Cells(15, 2)
For x = 5 To Workbooks("Copie de Base Mère.xlsm").Worksheets("Base Qualité").Range("A" & Rows.Count).End(xlUp).Row
    If Workbooks("Copie de Base Mère.xlsm").Worksheets("Base Qualité").Cells(x, 3) & Workbooks("Copie de Base Mère.xlsm").Worksheets("Base Qualité").Cells(x, 6) & Workbooks("Copie de Base Mère.xlsm").Worksheets("Base Qualité").Cells(x, 7) = Réf Then
        For y = 30 To 77
            If Workbooks("Copie de Base Mère.xlsm").Worksheets("Base Qualité").Cells(x, y) <> 0 Then
                z = Range("B" & Rows.Count).End(xlUp).Row + 1
                If z >= 65 Then z = 30
                Sheets("TRAME").Cells(z, 2) = Workbooks("Copie de Base Mère.xlsm").Worksheets("Base Qualité").Cells(4, y)
                Sheets("TRAME").Cells(z, 3) = Workbooks("Copie de Base Mère.xlsm").Worksheets("Base Qualité").Cells(x, y)
            End If
        Next
    End If
Next
End Sub

Restant à ta dispo ^^

Rechercher des sujets similaires à "fonction recherche macro"