VBA - Vérifier si variable stockée dans une variable tableau

- Introduction
- Code de la fonction avec Match
- Procédure d'appel
- Code de fonction avec une boucle
- Performances
- Exemple
Introduction
Pour vérifier qu'une variable tableau contient la donnée recherchée, nous pouvons boucler sur tous les éléments de ce tableau.Il existe une autre solution : l'utilisation de la fonction INDEX(), native d'Excel et, dans le cas de tableaux à deux dimensions, de la combinaison INDEX / EQUIV.
Cependant, si la valeur cherchée n'est pas trouvée, Application.Match renvoie une erreur. Logique, tout comme le ferait INDEX...
Par conséquent, il nous faut traiter cette possibilité d'erreur ainsi que le nombre de dimensions de notre variable tableau.
C'est pourquoi, je vous propose cette petite fonction.
Code de la fonction avec Match
Function EstDans(mot As String, Tabl) As Boolean Dim Dimension As Byte, j As Integer On Error Resume Next If IsError(UBound(Tabl, 2)) Then Dimension = 1 Else Dimension = 2 On Error GoTo 0 Select Case Dimension Case 1 On Error Resume Next EstDans = Application.Match(mot, Tabl, 0) On Error GoTo 0 Case 2 For j = 1 To UBound(Tabl, 2) On Error Resume Next EstDans = Application.Match(mot, Application.Index(Tabl, , j), 0) On Error GoTo 0 If EstDans = True Then Exit For Next End Select End Function
Procédure d'appel
Sub test() Dim Tb(), i As Integer 'tb 2 dimensions : Tb = Range("A2:C16").Value Debug.Print EstDans(MaValeur, Tb) Erase Tb 'tb 1 dimension : ReDim Preserve Tb(15) For i = 0 To 14 Tb(i) = Cells(i + 2, 1) Next Debug.Print EstDans(MaValeur, Tb) End Sub
Code de fonction avec une boucle
La structure de cette fonction est similaire à celle avec Match.Function BoucleSurTabl(mot As String, Tb) As Boolean Dim Dimension As Byte, i As Long, j As Long BoucleSurTabl = False On Error Resume Next If IsError(UBound(Tb, 2)) Then Dimension = 1 Else Dimension = 2 On Error GoTo 0 Select Case Dimension Case 1 For j = LBound(Tb) To UBound(Tb) If Tb(j) = mot Then BoucleSurTabl = True: Exit Function Next Case 2 For i = LBound(Tb, 1) To UBound(Tb, 1) For j = LBound(Tb, 2) To UBound(Tb, 2) If Tb(i, j) = mot Then BoucleSurTabl = True: Exit Function Next j Next i End Select End Function
Performances
Contre toute attente, Application.Match, sur de grands tableaux s'avère beaucoup moins performante que la boucle.Sur des tests :
Variable tableau à 2 dimensions Range("A1:Y20002")
- avec Match : 8,300781 secondes,
- avec boucle : 0,4375 secondes.
Variable tableau à une dimension :
- avec Match : instantané.
- avec boucle : 0,015625 secondes
Sur de petites variables tableaux, ou sur des variables tableaux à une seule dimension, la fonction avec Application.Match est toutefois plus "élégante" et parfois même plus rapide...
Il vous faudra donc étudier, au préalable, les données à analyser.
Ceci est d'autant plus vrai si vous devez rechercher plusieurs occurrences de la même valeur.
Les appels successifs à la fonction Match (tout comme les appels successifs à une fonction .Find) vont être beaucoup plus lent qu'une boucle sur une variable tableau.
Exemple
Vous pouvez télécharger le classeur exemple à l'adresse : https://www.cjoint.com/c/DHfpeqMBvRKN'hésitez pas en cas de besoin.
Ce document intitulé « VBA - Vérifier si variable stockée dans une variable tableau » issu de Comment Ça Marche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.