Index match VBA
bonjour,
J'essaye d'utiliser la fonction index(match) pour appeler des libellés de produits sur un autre onglet correspondant à des codes produits
OBJTARIF correspond à un annuaire de tous les produits avec leur code et libelé et sous famille
et je dois apppelé les produits du tarif 202
dans l'onglet exports :
mais le code suivant ne semble pas marche :
quelqu'un aurait il une idée pour m'aider?
fichier ci joint
Sub Macro5()
Dim N As Long, DL As Long
With Sheets("OBJTARIF")
Max = .Cells(.Rows.Count, 2).End(xlUp).Row
For N = 1 To Max
If .Cells(N, 2) = 202 Then DL = N
Next N
End With
For X = 27 To DL
Sheets("exports").Cells(X, 4).FormulaR1C1 = _
"= INDEX(OBJTARIF!$g$1:$g$dl,MATCH(RC[x],OBJTARIF!$f$1:$f$dl,0))"
Next X
End Sub
merci pour toute aide,
Mathylde
Bonsoir ma chère Mathylde,
si tu ne respectes pas un minimum les gens qui te proposent des solutions en ayant la politesse de leur répondre, tu pourras attendre longtemps pour qu'on s'intéresse encore à tes demandes.
Ceci dit je te souhaite bonne continuation.
Bonjour h2so4,
peut-être que MathyldeRecherche Susan désespérément ? euh, non, recherche son sujet précédent (mais ne le trouve plus ?) ; alors voici un p'tit coup d'pouce pour Mathylde : c'était "equivalent recherche v en vba" : https://forum.excel-pratique.com/viewtopic.php?p=670631#p670631
elle aura ainsi l'occasion de lire ta réponse (avec ta proposition de correction de son code VBA), et je suis sûr qu'elle ne manquera pas de tester ta solution, puis de t'informer des résultats obtenus (n'est-ce pas, Mathylde ?
@Mathylde
quand ton sujet précédent sera réglé, n'oublie pas d'revenir à celui pour répondre aux réponses reçues (s'il y en a eu) !
Bonsoir ma chère Mathylde,
si tu ne respectes pas un minimum les gens qui te proposent des solutions en ayant la politesse de leur répondre, tu pourras attendre longtemps pour qu'on s'intéresse encore à tes demandes.
Ceci dit je te souhaite bonne continuation.
Bonjour H2S04
Desolee du temps de réponse ..
Et déjà ; merci beaucoup pr votre aide ;
comme je l'ai écrit sur l'autre sujet : j'ai essayé le code en l'adaptant sur ce fichier mais je n'y suis pas arrivée
Hier soir j'ai cru que c'était mon fichier exemple qui correspondait pas à ce que je voulais . Du coup j'ai refais un autre sujet en étant plus claire
Je débute sur le forum et je reconnais ne pas maîtriser tous les codes de bonne conduite veuillez m'en excuser.
Pr ne pas faire perdre plus de temps à d'autre personne jai clôturé l'autre sujet .
Merci encore d'avoir répondu.
Mathylde.
Bonjour,
merci d'avoir répondu.
je t'invite à lire les règles du forum (voir ma signature) si tu ne l'as déjà fait.
voici une adaptation du code proposé
dl = Sheets("objTarif").Cells(Rows.Count, 3).End(xlUp).Row 'dernière ligne du tarif
With Sheets("exports")
For x = 27 To .Cells(Rows.Count, 3).End(xlUp).Row 'on parcourt toutes les lignes de export
If .Cells(x, 3).Value <> "" Then 'on recherche le code produit dans la colonne F de tarif
Set re = Sheets("objTarif").Range("F1").Resize(dl).Find(.Cells(x, 3).Value, lookat:=xlWhole, LookIn:=xlValues)
If Not re Is Nothing Then 'si trouvé on met le libellé de tarif (qui se trouve une case à droite du code produit) en colonne 4 de export
.Cells(x, 4) = re.Offset(, 1)
Else 'si pas trouvé
.Cells(x, 4) = "produit non trouvé"
End If
End If
Next x
End WithBonjour,
merci d'avoir répondu.
je t'invite à lire les règles du forum (voir ma signature) si tu ne l'as déjà fait.
voici une adaptation du code proposé
dl = Sheets("objTarif").Cells(Rows.Count, 3).End(xlUp).Row 'dernière ligne du tarif With Sheets("exports") For x = 27 To .Cells(Rows.Count, 3).End(xlUp).Row 'on parcourt toutes les lignes de export If .Cells(x, 3).Value <> "" Then 'on recherche le code produit dans la colonne F de tarif Set re = Sheets("objTarif").Range("F1").Resize(dl).Find(.Cells(x, 3).Value, lookat:=xlWhole, LookIn:=xlValues) If Not re Is Nothing Then 'si trouvé on met le libellé de tarif (qui se trouve une case à droite du code produit) en colonne 4 de export .Cells(x, 4) = re.Offset(, 1) Else 'si pas trouvé .Cells(x, 4) = "produit non trouvé" End If End If Next x End With
Bonjour, H2SO4 ;
merci pour le lien , je vais le lire , ça m'évitera de faire encore des bétises ^^
alors j'ai testé le code : il fonctionne : c'est super
mais je voudrais bien comprendre : comment fonctionne l'élément en gras :
Set re = Sheets("objTarif").Range("F1").Resize(dl).Find(.Cells(x, 3).Value, lookat:=xlWhole, LookIn:=xlValues)
If Not re Is Nothing Then 'si trouvé on met le libellé de tarif (qui se trouve une case à droite du code produit) en colonne 4 de export
.Cells(x, 4) = re.Offset(, 1)
j'ai du mal à interpréter comment cela fonctionne :
"set re"
"if not re"
"re.offset(,1)"
merci
re-bonjour,
Set re = Sheets("objTarif").Range("F1").Resize(dl).Find(.Cells(x, 3).Value, lookat:=xlWhole, LookIn:=xlValues)on utilise l'instruction set pour mettre un objet dans une variable. la variable s'appelle re et contiendra un objet de type cellule.
quant à la suite de l'instruction
Sheets("objTarif").Range("F1").Resize(dl).Find(.Cells(x, 3).Value, lookat:=xlWhole, LookIn:=xlValues)signifie : rechercher (find) le code produit (.cells(x,3) dans la colonne F, - limitée au nombre de lignes utilisées -, de la feuille "objTarif" Sheets("objTarif").Range("F1").Resize(dl). Le résultat de cette recherche est un objet de type cellule (range) si pas trouvé, l'objet est vide.
If Not re Is Nothing Then 'si trouvé on met le libellé de tarif (qui se trouve une case à droite du code produit) en colonne 4 de exporton teste si re n'est pas vide (is Nothing), Nothing s'applique à des variables de type objet
.Cells(x, 4) = re.Offset(, 1)offset est une méthode (une fonction) qui permet de faire référence à une cellule relativement à une autre. En l'occurrence, prendre la cellule sur la même ligne que la cellule re mais une colonne à droite de la cellule re. Pour prendre la valeur de la cellule du dessus on aurait mis re.offset(-1,0)
Super merci pour les explications ;
je rencontre néanmoins un problème quand j'ajoute plusieurs tarifs à la suite
comment faire pour que les libellés sous famille et les libellés produits soient recherchés que dans le tarif étudié (ici 202) ?
j'ai trouvé pour copier coller les bons codes produits du bon tarif
mais pas les bons libellés sous famille et les libellés produits car ils utilisent la commande mise au point et je ne sais pas comment l'adapter.
pour l'instant il prend le premier libellé qu'il trouve.
il faudrait pouvoir lui indiquer une zone de travail
celle ou Sheets("OBJTARIF").Cells(x, 2).Value = "202"
mais je ne sais pas comment faire ...
une idée ?
(merci)
Bonjour,
probablement pas exactement ce que tu as demandé, mais une fois que la ligne du code produit (s'il est unique) est trouvée, tu peux recopier tous les éléments de la ligne qui t'intéresse. Si le code produit n'est pas unique, alors il faudra faire autrement, mais c'est possible aussi ... à toi de dire.
DL = Sheets("objTarif").Cells(Rows.Count, 3).End(xlUp).Row 'dernière ligne du tarif
With Sheets("exports")
For x = 27 To .Cells(Rows.Count, 3).End(xlUp).Row 'on parcourt toutes les lignes de export
If .Cells(x, 3).Value <> "" Then 'on recherche le code produit dans la colonne F de tarif
Set re = Sheets("objTarif").Range("F1").Resize(DL).Find(.Cells(x, 3).Value, lookat:=xlWhole, LookIn:=xlValues)
If Not re Is Nothing Then 'si trouvé on met le libellé de tarif (qui se trouve une case à droite du code produit) en colonne 4 de export
.Cells(x, 4) = re.Offset(, 1) ' libellé produit
.Cells(x, 1) = re.Offset(, -1) ' libellé sous-famille
.Cells(x, 5) = re.Offset(, -2) ' code sous-famille
.Cells(x, 6) = re.Offset(, -3) ' date
.Cells(x, 7) = re.Offset(, -4) ' code tarif
.Cells(x, 8) = re.Offset(, -5) ' catégorie
Else 'si pas trouvé
.Cells(x, 4) = "produit non trouvé"
End If
End If
Next x
End Withba enfaite les produits peuvent se retrouver dans plusieurs tarifs ; donc le code produit n'est pas unique d'où la prise de tête
re-bonjour,
dans ce cas
DL = Sheets("objTarif").Cells(Rows.Count, 3).End(xlUp).Row 'dernière ligne du tarif
With Sheets("exports")
For x = 27 To .Cells(Rows.Count, 3).End(xlUp).Row 'on parcourt toutes les lignes de export
trv = False
If .Cells(x, 3).Value <> "" Then 'on recherche le code produit dans la colonne F de tarif
Set re = Sheets("objTarif").Range("F1").Resize(DL).Find(.Cells(x, 3).Value, lookat:=xlWhole, LookIn:=xlValues)
If Not re Is Nothing Then
fa = re.Address
Do
If re.Offset(, -4) = 202 Then 'si trouvé on met le libellé de tarif (qui se trouve une case à droite du code produit) en colonne 4 de export
.Cells(x, 4) = re.Offset(, 1) ' libellé produit
.Cells(x, 1) = re.Offset(, -1) ' libellé sous-famille
.Cells(x, 5) = re.Offset(, -2) ' code sous-famille
.Cells(x, 6) = re.Offset(, -3) ' date
.Cells(x, 7) = re.Offset(, -4) ' code tarif
.Cells(x, 8) = re.Offset(, -5) ' catégorie
trv = True 'on a trouvé
Exit Do 'on sort de la boucle
End If
'si pas trouvé on cherche la ligne suivante qui contient le code produit
Set re = Sheets("objTarif").Range("F1").Resize(DL).FindNext(re)
Loop Until re.Address = fa 'on boucle tant qu'on ne retombe pas sur la première ligne trouvée
End If
If Not trv Then 'si pas trouvé
.Cells(x, 4) = "produit non trouvé"
End If
End If
Next x
End Withoh la la c'est super j'ai passé ma journée dessus je trouvais pas comment faire !
merci merci merci
je vais décortiquer tout ça
