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:
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
MATCH
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
Merci pour vos remarques constructives.

Cordialement,
Sébastien