Retourner l'index d'un élément dans un tableau Excel VBA

J’ai un tableau prLst qui est une liste d’entiers. Les entiers ne sont pas triés, car leur position dans le tableau représente une colonne particulière sur un tableur. Je veux savoir comment trouver un entier particulier dans le tableau et retourner son index.

Il ne semble pas y avoir de ressource me montrant comment faire sans transformer le tableau en une plage sur la feuille de calcul. Cela semble un peu compliqué. Est-ce simplement impossible en VBA ?

Dim pos, arr, val

arr=Array(1,2,4,5)
val = 4

pos=Application.Match(val, arr, False)

if not iserror(pos) then
   Msgbox val & " is at position " & pos
else
   Msgbox val & " not found!"
end if

Mis à jour pour montrer l’utilisation de Match (avec .Index) pour trouver une valeur dans une dimension d’un tableau bidimensionnel :

Dim arr(1 To 10, 1 To 2)
Dim x

For x = 1 To 10
    arr(x, 1) = x
    arr(x, 2) = 11 - x
Next x

Debug.Print Application.Match(3, Application.Index(arr, 0, 1), 0)
Debug.Print Application.Match(3, Application.Index(arr, 0, 2), 0)

EDIT : il vaut la peine d’illustrer ici ce que @ARich a souligné dans les commentaires - que l’utilisation d’Index() pour découper un tableau a des performances horribles si vous le faites dans une boucle.

En test (code ci-dessous), l’approche Index() est presque 2000 fois plus lente que l’utilisation d’une boucle imbriquée.

Sub PerfTest()

    Const VAL_TO_FIND As String = "R1800:C8"
    Dim a(1 To 2000, 1 To 10)
    Dim r As Long, c As Long, t

    For r = 1 To 2000
        For c = 1 To 10
            a(r, c) = "R" & r & ":C" & c
        Next c
    Next r

    t = Timer
    Debug.Print FindLoop(a, VAL_TO_FIND), Timer - t
    ' >> 0.00781 sec

     t = Timer
    Debug.Print FindIndex(a, VAL_TO_FIND), Timer - t
    ' >> 14.18 sec

End Sub

Function FindLoop(arr, val) As Boolean
    Dim r As Long, c As Long
    For r = 1 To UBound(arr, 1)
    For c = 1 To UBound(arr, 2)
        If arr(r, c) = val Then
            FindLoop = True
            Exit Function
        End If
    Next c
    Next r
End Function

Function FindIndex(arr, val)
    Dim r As Long
    For r = 1 To UBound(arr, 1)
        If Not IsError(Application.Match(val, Application.Index(arr, r, 0), 0)) Then
            FindIndex = True
            Exit Function
        End If
    Next r
End Function