2010-11-19 14 views
37

Mam tablicę łańcuchów:Jak mogę użyć a dla każdej pętli w tablicy?

Dim sArray(4) as String 

ja jadę przez każdy ciąg w tablicy:

for each element in sarray 
    do_something(element) 
next element 

do_something pobiera ciąg jako parametr

Otrzymuję odejście błędzie element jako ciąg:

ByRef Argument Mismatc h

Czy powinienem konwertować element na ciąg lub coś takiego?

+0

brzmi jak twój podpis do_something ma określony byref określony, ale zamiast tego powinien być onval? – CarneyCode

Odpowiedz

70

Element musi być wariantem, więc nie możesz zadeklarować go jako ciąg. Twoja funkcja powinna zaakceptować wariant, jeśli jest ciągiem, o ile przekazujesz go przez 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 

Inną opcją jest przekonwertowanie wariantu na ciąg przed jego przekazaniem.

do_something CStr(element) 
+9

Udzieliłem tej odpowiedzi w głosowaniu wstępnym, ponieważ jest to dosłownie pytanie, ale uważam, że ta referencja również zasługuje na uwagę: https://support.microsoft.com/en-us/kb/129931 –

+0

To nic nie da, ponieważ sArray jest pusty?!?! – Black

+0

@EdwardBlack - Podał tylko fragmenty kodu, które są istotne dla dyskusji. Przypuszczalnie dodatkowy kod pomiędzy wymiarowaniem sArray a pętlą For Each faktycznie to zdefiniował. Ale jak to jest zdefiniowane, nie jest ważne dla pytania. –

23

A dla każdej struktury pętli jest bardziej zaprojektowany wokół obiektu kolekcji. Pętla For..Each wymaga typu wariantu lub obiektu. Ponieważ zmienna „Element” jest wpisane jako wariant swoją funkcję „do_something” będą musieli zaakceptować typ wariantu, można też modyfikować swoją pętlę na coś takiego:

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 
+0

+ Jeden, korzystanie z LBound i UBound jest jasne !! Chociaż inną alternatywą jest użycie bloku For Each .. – SIslam

5

Używam zmiennej licznika, jak sugeruje Fink. Jeśli chcesz dla każdego i przekazać ByRef (który może być bardziej efektywny dla długich ciągów) trzeba oddać elementu jako ciąg znaków z wykorzystaniem 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 
2

co o tej prostej funkcji 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 
Powiązane problemy