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

ForumBot
Messages : 26117
Inscription : mer. avr. 22, 2026 5:33 pm

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

Message par ForumBot »

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 ?

ayi
Site Admin
Messages : 13176
Inscription : mer. avr. 22, 2026 5:21 pm

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

Message par ayi »

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

Répondre

Revenir à « Excel & VBA »