garth_algar
XLDnaute Junior
Bonjour à tous,
J'ai besoin d'effectuer une recherche verticale selon deux critères. J'ai créé deux fonctions, mais chacune à un inconvénient.
J'ai commencé par le plus simple : une boucle :
Elle fonctionne très bien, dans tous les classeurs, mais pour une plage contenant beaucoup de ligne, c'est excessivement long.
Pour réduire le temps d'exécution, j'ai utilisé une adaptation du SOMMEPROD :
Cette fonction fonctionne très bien, est plus rapide que la précédente, mais ne fonctionne que dans la feuille où se situe ma plage ...
Je joins un fichier exemple. Voyez-vous une possibilité d'amélioration de l'une ou l'autre de ces deux fonctions ?
Merci d'avance pour vos réponses
J'ai besoin d'effectuer une recherche verticale selon deux critères. J'ai créé deux fonctions, mais chacune à un inconvénient.
J'ai commencé par le plus simple : une boucle :
Code:
Function RECH_VV(Plage As Range, CritereV1 As Variant, CritereV2 As Variant, NumColCritereV2 As Integer, NumColRecherche As Integer)
Dim i As Integer
For i = 1 To Plage.Rows.Count
If Plage.Cells(i, 1) = CritereV1 And Plage.Cells(i, NumColCritereV2) = CritereV2 Then
RECH_VV = Plage.Cells(i, NumColRecherche)
Exit For
End If
Next i
End Function
Elle fonctionne très bien, dans tous les classeurs, mais pour une plage contenant beaucoup de ligne, c'est excessivement long.
Pour réduire le temps d'exécution, j'ai utilisé une adaptation du SOMMEPROD :
Code:
Function RECHERCHEVV(critere1 As Variant, critere2 As Variant, plage As Range, n_col_crit2 As Integer, n_col_rech As Integer) As Variant
Dim col1 As Range
Dim col2 As Range
Dim col3 As Range
Dim numcol1 As Integer
numcol1 = plage.Column
Set col1 = Application.Intersect(Columns(numcol1), plage)
Set col2 = Application.Intersect(Columns(numcol1 + n_col_crit2 - 1), plage)
Set col3 = Application.Intersect(Columns(numcol1 + n_col_rech - 1), plage)
RECHERCHEVV = Evaluate("SumProduct((" & col1.Address & "=" & critere1 & ") * (" & col2.Address & "=" & critere2 & ") * (" & col3.Address & "))")
End Function
Cette fonction fonctionne très bien, est plus rapide que la précédente, mais ne fonctionne que dans la feuille où se situe ma plage ...
Je joins un fichier exemple. Voyez-vous une possibilité d'amélioration de l'une ou l'autre de ces deux fonctions ?
Merci d'avance pour vos réponses