Boucles pour Vlookup jusqu'à la dernière ligne de ma colonne

Bonjour,

39exemple.xlsm (34.83 Ko)

Bonjour,

tu peux toujours nous fournir un fichier exemple représentatif avec des données bidon.

Bonjour, suite à ton conseil je viens de le faire

merci.

Bonjour,

Voici un essai:

Sub Test()
tableau = Array(11, 12, 15)
For j = 0 To 2
    Range(Cells(3, 2 + j), Cells(20000, 2 + j)).FormulaR1C1 = "=VLOOKUP(WB!RC1,mat," & tableau(j) & ",FALSE)"
Next j
End Sub

Re,

Merci de ta réponse si rapide, cependant :

  • Je ne souhaite pas voir apparaître la formule dans mes cellules si possible stp

Cependant, peux tu stp m'expliquer pourquoi le choix de ce codage afin que je comprenne au mieux les différentes options stp?

Merci d'avance!

Ah oui, en effet j'avais mal lu visiblement...

Ma solution n'est plus très adaptée du coup...

Si tu souhaites faire une boucle...

Peut-être faudrait-t-il essayer ceci:

sub test()
der_lig = Range("A" & Rows.count).end(xlup).row
for i = 3 to der_lig
    Range("B"&i) = Application.WorksheetFunction.VLookup(Worksheets("WB").Range("A"&i), mat, 11, False)
        Range("C"&i) = Application.WorksheetFunction.VLookup(Worksheets("WB").Range("A"&i), mat, 12, False)
        Range("D"&i) = Application.WorksheetFunction.VLookup(Worksheets("WB").Range("A"&i), mat, 15, False)
next i
End Sub

En fait je souhaitais écrire une ligne qui fasse tout, ça aurait mis la formule sur toutes les cellules d'un coup, le soucis c'est que tu veux les valeurs, je te propose alors quelque chose de plus simple, où on change juste la ligne dans tes fonctions via la boucle i.

J'utilise un calcul pour avoir der_lig pour être sûr de ne traiter que les lignes remplies de ton tableau, le programme marchera pour un nombre variable de cellules.

Je pense que cette solution conviendra mieux à ton besoin, merci de me dire si c'est le cas

Tout d'abord,

Merci beaucoup car j'ai compris le pourquoi du comment.

Le code semble fonctionner.

Mais il prend énormément de temps à s'appliquer (malgré le screenupdating=false)

Dans l'idée, on met 30 minutes à réaliser la tâche via un étirement des cellules.

Le but de mon codage étant de gagner du temps, tu connais une astuce permettant de réaliser ce code rapidement stp?

Es-ce-que quand j'enregistre ma matrice dans la macro cela marche bien?

Dim mat As Variant
mat = Worksheets("SAP").Range("A1:O57000")

C'est normal que le temps de calcul soit long, la raison pour laquelle c'est long, c'est que tu dois chercher 60 000 fois une valeur dans un tableau de 57 000 lignes, et donner cette valeur à une cellule.

On peut en effet passer par des tableaux pour essayer d'aller un peu plus vite

Par contre, pas sur que tu puisses passer une variable de type Variant, si la fonction attend une variable de type Range, ta déclaration de tableau m'a l'air bonne

Merci beaucoup de l'aide,

En effet, mon "derlig" renvoie à la ligne 63 000, et ma matrice fait 57 000 lignes

Je vais prendre mon mal en patience...

Merci

Bonjour,

une proposition qui ne devrait par durer des heures...

Sub aargh()
    Set wswb = Sheets("WB")
    Set wssap = Sheets("SAP")
    dlws = wswb.Cells(Rows.Count, 1).End(xlUp).Row
    dlwssap = wssap.Cells(Rows.Count, 1).End(xlUp).Row
    wswb.Cells(2, 1).Resize(dlws - 1, 1).Sort key1:=wswb.Cells(1, 1), order1:=xlAscending, Header:=xlYes
    wssap.Cells(1, 1).Resize(dlwssap, 15).Sort key1:=wssap.Cells(1, 1), order1:=xlAscending, Header:=xlYes
    res = wswb.Cells(1, 1).Resize(dlws, 4)
    sap = wssap.Cells(1, 1).Resize(dlwssap, 15)
    ptrwb = 3
    ptrsap = 2
    fin = False
    Do
        If res(ptrwb, 1) = sap(ptrsap, 1) Then
            res(ptrwb, 2) = sap(ptrsap, 11)
            res(ptrwb, 3) = sap(ptrsap, 12)
            res(ptrwb, 4) = sap(ptrsap, 15)
            If ptrsap < dlwssap Then ptrsap = ptrsap + 1 Else fin = True
            If ptrwb < dlws Then ptrwb = ptrwb + 1 Else fin = True
        ElseIf res(ptrwb, 1) < sap(ptrsap, 1) Then
            If ptrwb < dlws Then ptrwb = ptrwb + 1 Else fin = True
        Else
            If ptrsap < dlwssap Then ptrsap = ptrsap + 1 Else fin = True
        End If
    Loop Until fin
    wswb.Cells(1, 1).Resize(dlws, 4) = res
End Sub

Bonjour,

La macro marche bien, malgré que lorsque j'ai un doublon dans ma clé, la cellule correspondante ne se remplit que une fois... Mais ça devrait le faire

Je ne peux pas insérer de photo via un hebergeur d'image, mais si sur le fichier exemple transmis, j'ai 2 fois la clé 1, puis 3 fois la clé 2 et bien il n'y a que une cellule qui se remplie.

Cependant tu peux m'expliquer un peu le code stp?

Je trouve ça "bête" de l'utiliser sans trop comprendre la réflexion derrière :/

Je comprends bien cette partie du code (ce qu'elle fait, pourquoi, où sont les fin etc...) et c'est ce que je voulais faire sans savoir comment le réaliser

Do
        If res(ptrwb, 1) = sap(ptrsap, 1) Then
            res(ptrwb, 2) = sap(ptrsap, 11)
            res(ptrwb, 3) = sap(ptrsap, 12)
            res(ptrwb, 4) = sap(ptrsap, 15)
            If ptrsap < dlwssap Then ptrsap = ptrsap + 1 Else fin = True
            If ptrwb < dlws Then ptrwb = ptrwb + 1 Else fin = True
        ElseIf res(ptrwb, 1) < sap(ptrsap, 1) Then
            If ptrwb < dlws Then ptrwb = ptrwb + 1 Else fin = True
        Else
            If ptrsap < dlwssap Then ptrsap = ptrsap + 1 Else fin = True
        End If
    Loop Until fin
    wswb.Cells(1, 1).Resize(dlws, 4) = res

Par contre la première partie est un peu plus floue

  Set wswb = Sheets("WB")
    Set wssap = Sheets("SAP")
    dlws = wswb.Cells(Rows.Count, 1).End(xlUp).Row
    dlwssap = wssap.Cells(Rows.Count, 1).End(xlUp).Row
    wswb.Cells(2, 1).Resize(dlws - 1, 1).Sort key1:=wswb.Cells(1, 1), order1:=xlAscending, Header:=xlYes
    wssap.Cells(1, 1).Resize(dlwssap, 15).Sort key1:=wssap.Cells(1, 1), order1:=xlAscending, Header:=xlYes
    res = wswb.Cells(1, 1).Resize(dlws, 4)
    sap = wssap.Cells(1, 1).Resize(dlwssap, 15)
    ptrwb = 3
    ptrsap = 2
    fin = False

Merci d'avance

Bonjour

S'il peut y avoir des doubles dans WB, adapte le code ainsi

Do
        If res(ptrwb, 1) = sap(ptrsap, 1) Then
            res(ptrwb, 2) = sap(ptrsap, 11)
            res(ptrwb, 3) = sap(ptrsap, 12)
            res(ptrwb, 4) = sap(ptrsap, 15)
            If ptrwb < dlws Then ptrwb = ptrwb + 1 Else fin = True
        ElseIf res(ptrwb, 1) < sap(ptrsap, 1) Then
            If ptrwb < dlws Then ptrwb = ptrwb + 1 Else fin = True
        Else
            If ptrsap < dlwssap Then ptrsap = ptrsap + 1 Else fin = True
        End If
    Loop Until fin
    wswb.Cells(1, 1).Resize(dlws, 4) = res

pour explication de cette partie du code

  Set wswb = Sheets("WB") 'wswb = feuille WB
    Set wssap = Sheets("SAP") 'wssap = feuille SAP
    dlws = wswb.Cells(Rows.Count, 1).End(xlUp).Row ' dernière ligne de wswb
    dlwssap = wssap.Cells(Rows.Count, 1).End(xlUp).Row 'dernière ligne de wssap
    wswb.Cells(2, 1).Resize(dlws - 1, 1).Sort key1:=wswb.Cells(1, 1), order1:=xlAscending, Header:=xlYes 'tri de wswb sur clé
    wssap.Cells(1, 1).Resize(dlwssap, 15).Sort key1:=wssap.Cells(1, 1), order1:=xlAscending, Header:=xlYes ' tri de wssap sur clé
    res = wswb.Cells(1, 1).Resize(dlws, 4) 'copie de wsb dans tableau res
    sap = wssap.Cells(1, 1).Resize(dlwssap, 15) 'copie de wssap dans tableau sap
    ptrwb = 3 'pointeur de 1ere ligne de données sur wswb
    ptrsap = 2 'pointeur de 1ere ligne de données sur wssap
    fin = False 'indique si on a traité toute les lignes

Je te remercie infiniment,

Tant pour le code qui marche parfaitement, que pour l'explication.

Je vais m'appliquer et essayé de refaire un code similaire afin de voir si j'ai assimilé ce que tu m'as expliqué.

Merci également "ausecour" pour ton aide, grâce à vous j'ai découvert de nouvelles "fonctions" de codage mais surtout comment les utiliser!

Je peux donc clore le sujet

Bonjour,

est-ce plus rapide ? combien de temps dure l'exécution de la macro sur ton fichier ?

Je vais récupérer les données et je te dis dans l'heure

Après essaie sur mon fichier,

cela marche bien jusqu'à la ligne 2 600, par contre des lignes 2 600 à 67 000 j'ai plus rien, surement que je dois adapter le code je vais m'y pencher.

Bonjour,

Si le fichier en question contient des formules Excel, l'exécution du code sera plus rapide en désactivant le recalcul auto des formules le temps de l'exécution. Il faut ajouter :

Application.Calculation = xlCalculationManual
'Le cœur du code...
Application.Calculation = xlCalculationAutomatic
Rechercher des sujets similaires à "boucles vlookup derniere ligne colonne"