Bonjour,
Je cherche à réaliser une recherche multi-critères dans un tableau Excel. Je m'explique : D'un côté, j'ai un tableau contenant certaines valeurs. De l'autre, j'ai un tableau contenant les mêmes données, mais dans des colonnes différentes, et dans un ordre différent.
Par exemple, je vais avoir :
Tableau 1 :
x1,x2,x3
y1,y2,y3
z1,z2,z3
Tableau 2 :
y2,y3,y1
x2,x3,x1
z2,z3,z1
Je souhaite vérifier pour chaque ligne du Tableau 1 qu'une correspondance existe dans le Tableau 2, en lui donnant la correspondance des colonnes (dans mon exemple, 1<->2, 2<->3 et 3<->1)
J'ai déjà fait un truc, dont le principe est le suivant :
Pour chaque ligne du Tableau 1
Pour le nombre de colonnes représentatives, je vais faire une sélection progressive : D'abord, je construis une liste contenant les lignes où le premier critère correspond.
Puis je parcours cette liste, et pour chaque ligne, je vérifie le second critère, ce qui me donne une nouvelle liste plus sélective
etc... autant de fois qu'il y a de critères.
Le code (ici, j'ai juste "simulé" le nombre de critères, mais la correspondance entre les colonnes est facile à implémenter) :
Code :
- Option Explicit
- Sub Test()
- Application.ScreenUpdating = False
- Dim Time1 As Variant
- Dim Time2 As Variant
- Dim i As Integer
- Dim j As Variant
- Dim k As Integer
- Dim l As Integer
- Dim NbCriteria As Integer
- Dim SelectionListVirgin()
- Dim SelectionList()
- Dim SelectionListTempo()
- Time1 = Time
- i = 1
- While Sheets("All" ).Cells(i, 1) <> ""
- ReDim Preserve SelectionListVirgin(1 To i)
- SelectionListVirgin(i) = i
- i = i + 1
- Wend
- For l = 1 To Sheets("Feuil1" ).UsedRange.Rows.Count
- SelectionList = SelectionListVirgin
- NbCriteria = 4
- For i = 1 To NbCriteria
- k = 1
- For Each j In SelectionList
- If Sheets("All" ).Cells(j, i) = Sheets("Feuil1" ).Cells(l, i) Then
- ReDim Preserve SelectionListTempo(1 To k)
- SelectionListTempo(k) = j
- k = k + 1
- End If
- Next
- SelectionList = SelectionListTempo
- ReDim SelectionListTempo(1 To 1)
- SelectionListTempo(1) = "NULL"
- Next
- Sheets("Feuil1" ).Cells(l, 5) = SelectionList
- Next
- Time2 = Time
- Application.ScreenUpdating = True
- Sheets("Feuil1" ).Cells(1, 6) = Time2 - Time1
- End Sub
|
Dans les faits, ça marche. Le problème, c'est que pour 4 critères, pour matcher 100 lignes parmi 30,000, ça prend un peu plus de 3 minutes. Or le truc, c'est qu'il va falloir que mon affaire soit capable de gérer un matching de jusqu'à 20 critères, pour matcher 50,000 entrées parmis 50,000 (ordres de grandeurs)
Vous imaginez aisément l'explosion du temps de traitement...
Idéalement, une évolution du vlookup pour pouvoir matcher plusieurs critères serait idéale, mais je n'ai pas connaissance de l'existence d'une telle fonction...
Voilà voilà, si quelqu'un a une idée, ça pourrait m'être diablement utile
Merci beaucoup !
---------------
"Mon modèle, c'est moi-même."