2010-11-19 40 views
37

Tôi có một mảng của Strings:Tôi làm cách nào để sử dụng cho mỗi vòng lặp trên một mảng?

Dim sArray(4) as String 

Tôi đang trải qua mỗi String trong mảng:

for each element in sarray 
    do_something(element) 
next element 

do_something mất một chuỗi như một tham số

Tôi nhận được một đường chuyền lỗi phần tử dưới dạng Chuỗi:

ByRef Đối số Mismatc h

Tôi có nên chuyển đổi phần tử thành Chuỗi hay gì đó không?

+0

âm thanh như chữ ký do_something của bạn có byref quy định nhưng nó nên được byval thay thế? – CarneyCode

Trả lời

70

Yếu tố cần phải được một biến thể, vì vậy bạn không thể khai báo nó như một chuỗi. Chức năng của bạn nên chấp nhận một biến thể nếu nó là một chuỗi mặc dù miễn là bạn vượt qua nó 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 

Tùy chọn khác là chuyển đổi biến thể thành chuỗi trước khi chuyển.

do_something CStr(element) 
+9

Tôi đã đưa ra câu trả lời này một cuộc bỏ phiếu vì đó là nghĩa đen những gì đã được hỏi, nhưng tôi cảm thấy tham chiếu có liên quan này cũng đáng được đề cập: https://support.microsoft.com/en-us/kb/129931 –

+0

Điều này sẽ không làm gì vì sArray trống?!?! – Black

+0

@EdwardBlack - Anh ấy chỉ đưa ra các đoạn mã có liên quan đến cuộc thảo luận. Có lẽ mã bổ sung giữa kích thước của sArray và vòng lặp For Each sẽ thực sự xác định nó. Nhưng làm thế nào nó được định nghĩa là không quan trọng cho câu hỏi. –

23

A cho mỗi cấu trúc vòng lặp được thiết kế xung quanh đối tượng bộ sưu tập. Vòng lặp For..Each yêu cầu một loại biến thể hoặc đối tượng. Kể từ khi "tố" biến của bạn đang được đánh máy như một biến thể "do_something" chức năng của bạn sẽ cần phải chấp nhận một loại biến thể, hoặc bạn có thể thay đổi vòng lặp của bạn để một cái gì đó như thế này:

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

+ Một, sử dụng LBound và UBound là rõ ràng !! Mặc dù một lựa chọn khác là sử dụng cho mỗi khối .. – SIslam

5

Tôi sử dụng biến truy cập như Fink gợi ý. Nếu bạn muốn cho mỗi và để vượt qua ByRef (có thể hiệu quả hơn cho các chuỗi dài), bạn phải bỏ yếu tố của bạn như là một chuỗi sử dụng 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

gì về chức năng này inArray đơn giản:

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 
Các vấn đề liên quan