Bonjour,
J'ai codé en VBA des versions améliorées de RECHERCHEV et EQUIV. Elles permettent :
- de retourner une valeur d'une colonne qui se trouverait à gauche de la colonne clé
- de commencer la recherche à partir d'une certaine ligne
- d'appliquer un critère de sélection sur une colonne
Cependant, sur un nombre important de lignes à parcourir, le temps de traitement est plus important que les fonctions natives d'Excel. Je sais que je ne pourrai pas être aussi rapide, mais je souhaiterai avoir des conseils pour optimiser les 2 fonctions ci-dessous :
VLOOKUP:
MATCH
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Function XXX_VLOOKUP(ByVal Feuille As Worksheet, ByVal PremiereLigne As Long, ByVal ColonneRecherche As Integer, ByVal ValeurCherchee As String, ByVal ColonneRetour As Integer, Optional ByVal ColonneCritere As Integer = -99, Optional ByVal ValeurCritere As String = "") As String Dim CptLigne As Long CptLigne = XXX_MATCH(Feuille, PremiereLigne, ColonneRecherche, ValeurCherchee, ColonneRetour, ColonneCritere, ValeurCritere) If CptLigne <> -99 Then XXX_VLOOKUP = Feuille.Cells(CptLigne, ColonneRetour) Else XXX_VLOOKUP = "-99" End If End Function
Merci pour vos remarques constructives.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 Function XXX_MATCH(ByVal Feuille As Worksheet, ByVal PremiereLigne As Long, ByVal ColonneRecherche As Integer, ByVal ValeurCherchee As String, ByVal ColonneRetour As Integer, Optional ByVal ColonneCritere As Integer = -99, Optional ByVal ValeurCritere As String = "") As Long Dim LigneFin As Long Dim bTrouve As Boolean Dim CptLigne As Long With Feuille LigneFin = .Cells(.Rows.Count, ColonneRecherche).End(xlUp).Row bTrouve = False CptLigne = PremiereLigne While CptLigne <= LigneFin And Not bTrouve If .Cells(CptLigne, ColonneRecherche) = ValeurCherchee Then If ValeurCritere = "" Or ColonneCritere = -99 Then bTrouve = True Else If Evaluate(.Cells(CptLigne, ColonneCritere) & ValeurCritere) Then bTrouve = True Else CptLigne = CptLigne + 1 End If End If Else CptLigne = CptLigne + 1 End If Wend If bTrouve Then XXX_MATCH = CptLigne Else XXX_MATCH = -99 End If End With End Function
Cordialement,
Sébastien
Partager