Importer plusieurs colonnes à partir d'un seul vlookup

ter

XLDnaute Nouveau
Bonjour tout le monde !

J'ai créé un programme qui va chercher plus d'une valeur correspondante à ma recherche à partir du vlookup.
Par exemple, pour le prénom "toto", je veux importer sa couleur de cheveux ("blond") et sa taille (1m50).

Mon programme utilise 2 vlookups pour aller importer ces deux informations. Mon problème est que les vlookup sont des applications plutôt longues (et je dois bien traiter 100 000 lignes à chaque fois que je lance le programme). Etant donné que le programme ait déjà allé cherché à quelles lignes correspondaient le prénom "toto" avec un premier vlookup (qui sera allé chercher sa couleur de cheveux), ne puis-je pas optimiser mon programme en utilisant cette ligne déjà trouvée pour récupérer les autres informations dessus (taille, poids, couleurs des yeux...) ?

En d'autres terme, dois-je vraiment faire plusieurs vlookup, ou peut-on récupérer plusieurs informations à partir d'un seul vlookup ? (ça me paraitrait absurde qu'on ne puisse pas, étant donné que l'ordinateur doit de nouveau rechercher la valeur "toto" parmi 100 000 lignes pour récupérer une info qui se trouve sur la colonne à côté !)

Merci d'avance
Ter
 

JNP

XLDnaute Barbatruc
Re : Importer plusieurs colonnes à partir d'un seul vlookup

Bonjour :)
Tu utilises EQUIV() pour ramener le n° de ligne, puis avec INDEX(), tu vas chercher toutes tes informations :)
MATCH() et INDEX() si tu es en anglais :)
Bonne suite :)
 

Theze

XLDnaute Occasionnel
Re : Importer plusieurs colonnes à partir d'un seul vlookup

Bonjour,

As-tu testé avec la méthode Find ? Un petit exemple :
Code:
Sub Test()

    Dim Tbl() As String
    Dim Texte As String
    Dim I As Integer
    
    'recherche en colonne A de la feuille active
    Tbl = Recherche("Le Nom", ActiveSheet, 1)
    
    For I = 1 To UBound(Tbl)
    
        Texte = Texte & Tbl(I) & vbCrLf
        
    Next I
    
    MsgBox Texte
    
End Sub

Function Recherche(Nom As String, _
                   Fe As Worksheet, _
                   NumCol As Integer) As String()

    Dim Tbl() As String
    Dim Plage As Range
    Dim Cel As Range
    Dim Ligne As Range
    Dim I As Integer
    
    With Fe
        
        'défini la plage
        Set Plage = .Range(.Cells(1, NumCol), .Cells(.Rows.Count, NumCol).End(xlUp))
        
        'effectue la recherche
        Set Cel = Plage.Find(Nom, , xlValues, xlWhole)
        
        'si trouvé :
        If Not Cel Is Nothing Then
            
            'défini la plage sur la ligne
            Set Ligne = .Range(.Cells(Cel.Row, 1), .Cells(Cel.Row, .Columns.Count).End(xlToLeft))
            
            'dimensionne le tableau afin de retourner toutes les valeurs
            ReDim Tbl(1 To Ligne.Columns.Count)
            
            For I = 1 To Ligne.Columns.Count
            
                Tbl(I) = Ligne(I)
                
            Next I
             
        'si pas trouvé :
        Else
            
            ReDim Tbl(1 To 1)
            Tbl(1) = "Le nom '" & Nom & "' n'a pas été trouvé dans la base de données !"
            
        End If
    
    End With
    
    'passe le tableau à la fonction
    Recherche = Tbl

End Function

Hervé.
 

ter

XLDnaute Nouveau
Re : Importer plusieurs colonnes à partir d'un seul vlookup

Bonjour JNP,

Je ne connaissais pas ces deux fonctions, merci de me les avoir suggéré.

Peux-tu me confirmer si j'ai bien compris ?
Au lieu du code :
Code:
For i = NbLigneavant + 3 To NbLignemnt + 3 'les valeurs commencent en ligne 4

            Cells(i, 1) = Application.VLookup(Cells(i, 54), Worksheets("feuil3").Range("BN:BN"), 1, False) 'info1
            Cells(i, 2) = Application.VLookup(Cells(i, 54), Worksheets("feuil3").Range("BN:BO"), 2, False) 'info2
            Cells(i, 3) = Application.VLookup(Cells(i, 54), Worksheets("feuil3").Range("BN:BP"), 3, False) 'info3
            Cells(i, 4) = Application.VLookup(Cells(i, 54), Worksheets("feuil3").Range("BN:BQ"), 4, False) 'info4

Next i

J'ai plutôt intérêt en gain de temps à mettre :
Code:
For i = NbLigneavant + 3 To NbLignemnt + 3
lignes = application.match(Cells(i,54),Worksheets("feuil3").Range("BN:BN"), 0)
Cells(i, 1) =application.worksheetfunction.index(Worksheets("feuil3").Range("BN:BQ"), 3 + lignes, 1)
Cells(i, 2) =application.worksheetfunction.index(Worksheets("feuil3").Range("BN:BQ"), 3 + lignes, 1)
Cells(i, 3) =application.worksheetfunction.index(Worksheets("feuil3").Range("BN:BQ"), 3 + lignes, 1)
Cells(i, 4) =application.worksheetfunction.index(Worksheets("feuil3").Range("BN:BQ"), 3 + lignes, 1)

Next i

C'est cela ? (ou finalement, le code est plus long à s'exécuter... ou ne marche pas) ?


Edit : je n'avais pas vu ton message Theze, je la regarderai demain.
Merci !
 
Dernière édition:

JNP

XLDnaute Barbatruc
Re : Importer plusieurs colonnes à partir d'un seul vlookup

Re,
Désolé, j'était pas dans le coin...
Non, si j'ai compris ce que tu faisais, c'est plutôt ceci :
Code:
Application.ScreenUpdating = False
For i = NbLigneavant + 3 To NbLignemnt + 3
lignes = Application.Match(Cells(i, 54), Worksheets("feuil3").Range("BN:BN"), 0)
Cells(i, 1) = Application.WorksheetFunction.Index(Worksheets("feuil3").Range("BN:BN"), lignes)
Cells(i, 2) = Application.WorksheetFunction.Index(Worksheets("feuil3").Range("BO:BO"), lignes)
Cells(i, 3) = Application.WorksheetFunction.Index(Worksheets("feuil3").Range("BP:BP"), lignes)
Cells(i, 4) = Application.WorksheetFunction.Index(Worksheets("feuil3").Range("BQ:BQ"), lignes)
Next i
Application.ScreenUpdating = True
Bon courage :)
 

job75

XLDnaute Barbatruc
Re : Importer plusieurs colonnes à partir d'un seul vlookup

Bonjour ter, salut Jean-Noël et Theze,

Pas d'objection à ce que vous passiez votre temps à poser des questions sur XLD.

Mais la moindre des choses est de donner une suite aux réponses qu'on vous donne :

Lien supprimé

A+
 

Discussions similaires

Statistiques des forums

Discussions
312 215
Messages
2 086 329
Membres
103 185
dernier inscrit
salhit