web-dev-qa-db-fra.com

Comment puis-je utiliser un pour chaque boucle sur un tableau?

J'ai un tableau de chaînes:

Dim sArray(4) as String

Je vais à travers chaque chaîne dans le tableau:

for each element in sarray
  do_something(element)
next element

do_something prend une chaîne en tant que paramètre

Je reçois une erreur en passant l'élément en tant que chaîne:

ByRef Argument Mismatch

Devrais-je convertir l'élément en chaîne ou quelque chose?

L'élément doit être une variante, vous ne pouvez donc pas le déclarer en tant que chaîne. Votre fonction devrait accepter une variante si c'est une chaîne si vous la passez ByVal.

Public Sub example()
    Dim sArray(4) As string
    Dim element As variant

    For Each element In sArray
        do_something (element)
    Next element
End Sub


Sub do_something(ByVal e As String)

End Sub

L'autre option consiste à convertir la variante en chaîne avant de la transmettre.

  do_something CStr(element)
101
Bobsickle

Une structure de boucle pour chaque boucle est davantage conçue autour de l'objet de collection. Une boucle For..Each nécessite un type ou un objet variant. Puisque votre variable "element" est en train d'être typée en tant que variante, votre fonction "do_something" devra accepter un type variant, ou vous pouvez modifier votre boucle comme suit:

Public Sub Example()

    Dim sArray(4) As String
    Dim i As Long

    For i = LBound(sArray) To UBound(sArray)
        do_something sArray(i)
    Next i

End Sub
34
Fink

J'utilise la variable compteur comme le suggère Fink. Si vous voulez For Each et passer ByRef (ce qui peut être plus efficace pour les longues chaînes), vous devez convertir votre élément en chaîne à l'aide de CStr.

Sub Example()

    Dim vItm As Variant
    Dim aStrings(1 To 4) As String

    aStrings(1) = "one": aStrings(2) = "two": aStrings(3) = "three": aStrings(4) = "four"

    For Each vItm In aStrings
        do_something CStr(vItm)
    Next vItm

End Sub

Function do_something(ByRef sInput As String)

    Debug.Print sInput

End Function
8
Dick Kusleika

qu'en est-il de cette simple fonction inArray:

Function isInArray(ByVal stringToBeFound As String, ByVal arr As Variant) As Boolean
For Each element In arr
    If element = stringToBeFound Then
        isInArray = True
        Exit Function
    End If
Next element
End Function
4
Sebastian Viereck