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

13essai1907.xlsm (38.21 Ko)

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) ! la charte du forum ne t'interdit pas de faire des nœuds à ton mouchoir !

dhany h-animaux10

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 With

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 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 export

on 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 With

ba 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 With

oh 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

Rechercher des sujets similaires à "index match vba"