Index match avec VBA

Bonjour à tous,

je souhaite appliquer la formule index/match à l'aide de VBA.

Je souhaite rechercher l'information sur la feuille liste facture pour la copier dans la feuille directeur en fonction du numero de voucher.

voici la formule que je souhaite appliquer :

=INDEX(facturation!$D$2:$D$4;MATCH(directeurs!F2;facturation!$F$2:$F$4;0))

Sous VBA j'ai essayé de le retranscrire de la maniere suivante :

Sub IndexMatch()

Dim nom_fille As Range
Dim liste_voucher As Range
Dim voucher_a_chercher As String
Dim der_lig As Long

der_lig = Range("A" & Rows.Count).End(xlUp).Row

nom_fille = Worksheets("feuille_liste_facture").Range("D2:D&der_lig")

liste_voucher = Worksheets("feuille_liste_facture").Range("F2:F&der_lig")

voucher_a_chercher = feuille_directeur.Cells(2, COLONNE_VOUCHER_NUMBER)

feuille_directeur.Cells(2, 18).Value = Application.WorksheetFunction.Index(nom_fille, Application.WorksheetFunction.Match(voucher_a_chercher, liste_voucher, 0))

End Sub

cependant je reçois un message d'erreur avec ce code concernant le range : subscript out of range error 9

vous trouverez en pièce jointe une version du fichier pour faciliter votre aide.

Merci à vous pour votre aide

Bonjour,

nom_fille = Worksheets("feuille_liste_facture").Range("D2:D&der_lig")

Il se trouve où l'onglet "feuille_liste_facture" ?

C'est le deuxième onglet "Facturation"

Re,

Corrige les erreurs, il y en a pleins, par exemple :

nom_fille = Worksheets("feuille_liste_facture").Range("D2:D&der_lig")

cela doit être

Set nom_fille = Worksheets("facturation").Range("D2:D" & der_lig)

en essayant de corriger mon erreur avec ce que tu m'as dit je recois le message object variable or with block variable not set

Mon idée de base était de définir un range afin de faciliter l'ecriture de la formule par la suite mais j'ai du mal à définir le range.

Re,

Essaye le code suivant :

Sub IndexMatch()

Dim nom_fille As Range
Dim liste_voucher As Range
Dim voucher_a_chercher As Double'Long doit marcher aussi mais pas String
Dim der_lig As Long

der_lig = feuille_directeur.Range("A" & Rows.Count).End(xlUp).Row

Setnom_fille =feuille_liste_facture.Range("D2:D" & der_lig)

Setliste_voucher = feuille_liste_facture.Range("F2:F" & der_lig)

voucher_a_chercher = feuille_directeur.Cells(2, COLONNE_VOUCHER_NUMBER)

feuille_directeur.Cells(2, 18) = Application.WorksheetFunction.Index(nom_fille, Application.WorksheetFunction.Match(voucher_a_chercher, liste_voucher, 0))

End Sub

Un GRAND merci à toi !!

Ça fonctionne. Je vais vérifier que cela fonctionne sur le fichier d'origine avec plus de 4000 lignes..

Juste par curiosité à quoi correspond le "SET" ?

C'était trop beau pour être vrai lol en faite sur le fichier d'origine je veux appliquer la formule pour chaque ligne de la feuille directeur.

Pour cela je fais donc varier le numero voucher avec un FOR comme ceci :

Public Function ajout_informations_table_facturation()

Dim lire_directeur As Long

Dim nom_fille As Range
Dim liste_voucher As Range
Dim voucher_a_chercher As Long
Dim der_lig As Long

feuille_directeur.Cells(1, 18).Value = "fille facturation"
feuille_directeur.Cells(1, 19).Value = "queue entry facturation"

Application.ScreenUpdating = False

'info pour la formule
der_lig = feuille_liste_facture.Range("A" & Rows.Count).End(xlUp).Row
Set nom_fille = feuille_liste_facture.Range("D2:D" & der_lig)
Set liste_voucher = feuille_liste_facture.Range("F2:F" & der_lig)

For lire_directeur = 2 To feuille_directeur.UsedRange.Rows.Count

voucher_a_chercher = feuille_directeur.Cells(lire_directeur, COLONNE_VOUCHER_NUMBER)

feuille_directeur.Cells(lire_directeur, 18).Value = Application.WorksheetFunction.Index(nom_fille, Application.WorksheetFunction.Match(voucher_a_chercher, liste_voucher, 0))

Next lire_directeur

Application.ScreenUpdating = True

End Function

lorsque j’exécute le code je recois le message suivant : Unable to get de match property of the worksheetFunction class

desole je suis pas trés doué avec VBA :s

Re,

Explication :

Sub Exemple()
    Dim maPlage1 As String 'déclaration de variable
    maPlage1 = "A1:A10" 'affectation d'une valeur de variable
    Range(maPlage1).Select
    Dim maPlage2 As Range
    'maPlage = Range("A1:A10") ne marchera pas car c'est un objet de type Range
    Set maPlage2 = Range("B1:B10")
    maPlage2.Select
End Sub

Re,

Comment as-tu eu ces codes ? C'est un big bazaar, je suis curieux aussi de connaître. Est-ce que le code initial a été modifié ou adapté par toi ? Je pense qu'il faut que je prennes une semaine de congés pour débogguer !!!! Je plaisantes....

loool je l'ai fait moi même c'est pour ça que c'Est un gros bordel hahahah

mais plus sérieusement c'est juste le for qui pose problème je viens de modifier le code sur le fichier d'essaie en rajoutant le for et je recois le meme message

Désole pour le gros bordel haha

Re,

Puisque c'est Noël , voici le code deboggué :

    Public Function ajout_informations_table_facturation()

        Dim lire_directeur As Long

        Dim nom_fille As Range
        Dim liste_voucher As Range
        Dim voucher_a_chercher As Long
        Dim der_lig As Long

        feuille_directeur.Cells(1, 18).Value = "fille facturation"
        feuille_directeur.Cells(1, 19).Value = "queue entry facturation"

        Application.ScreenUpdating = False

        'info pour la formule
        der_lig = feuille_liste_facture.Range("A" & Rows.Count).End(xlUp).Row
        Set nom_fille = feuille_liste_facture.Range("D2:D" & der_lig)
        Set liste_voucher = feuille_liste_facture.Range("F2:F" & der_lig)

        For lire_directeur = 2 To feuille_directeur.Range("A" & Rows.Count).End(xlUp).Row
        'For lire_directeur = 2 To feuille_directeur.UsedRange.Rows.Count donnait 4607 lignes alors qu'il n'y a que 4 lignes   
        voucher_a_chercher = feuille_directeur.Cells(lire_directeur, COLONNE_VOUCHER_NUMBER)
'Gestion des erreurs quand le programme ne trouve pas ce qu'il cherche par exemple ce qui est en F4
        On Error Resume Next
        feuille_directeur.Cells(lire_directeur, 18).Value = Application.WorksheetFunction.Index(nom_fille, Application.WorksheetFunction.Match(voucher_a_chercher, liste_voucher, 0))

        Next lire_directeur

        Application.ScreenUpdating = True

    End Function

NB : Du coup la gestion d'erreur de 2 lignes de code, il faut aussi insérer dans le code donné auparavant.

Merci Papa Noël ^^

Je viens de l'essayer sur le fichier d'origine et ça marche. Je ne connaissais pas le "On Error Resume Next" ca marche parfaitement.

Merci beaucoup.

Rechercher des sujets similaires à "index match vba"