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

Décembre 2016



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 : http://cjoint.com/?DHfpeqMBvRK

N'hésitez pas en cas de besoin.

A voir également :

Ce document intitulé «  VBA - Vérifier si variable stockée dans une variable tableau  » issu de CommentCaMarche (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.