2013-04-26 27 views
5

tôi đang làm việc trên thực hiện một bảng tính cho phép macro hiện chức năng về Excel cho Mac 2011.Excel cho Mac 2011: UBound() Không làm việc

Tôi có một chức năng (Source) để tìm kiếm các mảng cho một giá trị quy định :

Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean 
    IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1) 
End Function 

nó hoạt động hoàn hảo trong Excel 2013, nhưng trên Excel cho Mac 2011, tôi nhận được lỗi:

Runtime error '9': Subscript out of range 

tôi đã phá vỡ nó ra và phát hiện ra rằng các cuộc gọi UBound là gì gây ra lỗi.

Tôi muốn thay đổi ít nhất có thể để bảo trì. Làm thế nào tôi có thể sửa lỗi này cho phiên bản Mac?

Cảm ơn bạn trước đã trả lời!

Chỉnh sửa: @Siddharth Giải pháp tuyến đường là điểm, nhưng vì tôi đang tìm kiếm mảng trong vòng lặp, tôi phải sửa đổi vòng lặp để đặt lại mảng giữa mỗi lần lặp như sau (trong trường hợp bất kỳ ai khác chạy vào cùng một issue!):

' --- START Reset Array for OS X --- 
Dim OS_X_Hack(99) As String 

For intIndex = 0 To 99 
    OS_X_Hack(intIndex) = Original(intIndex) 
Next 

Erase Original() 
ReDim Original(0 To 99) As String 

For intIndex = 0 To 99 
    Original(intIndex) = OS_X_Hack(intIndex) 
Next 

Erase OS_X_Hack() 
' --- END Reset Array for OS X --- 
+0

Chỉ cần thử nghiệm trong Excel 2011. Nó hoạt động tốt cho tôi. Hy vọng bạn đang đi qua một mảng để một chức năng? Bạn có thể chỉ cho tôi cách bạn gọi chức năng này? –

Trả lời

4

Ok Đây là quan sát của tôi. Nếu bạn gọi hàm một lần trong một thủ tục thì nó sẽ hoạt động tốt. Ví dụ

Sub Sample() 
    Dim a As Variant 
    Dim s As String 
    Dim strTemp As String 

    s = "CC" 
    strTemp = "A,B,C,D" 

    a = Split(strTemp, ",") 

    Debug.Print IsInArray(s, a) 
End Sub 

Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean 
    IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1) 
End Function 

enter image description here

Tuy nhiên nếu bạn gọi nó là hai lần trong các thủ tục sau đó bạn sẽ nhận được một lỗi Runtime error '9': Subscript out of range. Có thể đó là lỗi Excel 2011?

Sub Sample() 
    Dim a As Variant 
    Dim s As String 
    Dim strTemp As String 

    s = "CC" 
    strTemp = "A,B,C,D" 

    a = Split(strTemp, ",") 

    Debug.Print IsInArray(s, a) 

    s = "A" 
    Debug.Print IsInArray(s, a) 
End Sub 

enter image description here

Giải pháp

Tái mảng. Xem ví dụ này.

Sub Sample() 
    Dim a As Variant 
    Dim s As String 
    Dim strTemp As String 

    s = "CC" 
    strTemp = "A,B,C,D" 

    a = Split(strTemp, ",") 
    Debug.Print IsInArray(s, a) 

    s = "A" 
    a = Split(strTemp, ",") 
    Debug.Print IsInArray(s, a) 
End Sub 

Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean 
    IsInArray = (UBound(Filter(arr, stringToBeFound)) > -1) 
End Function 

enter image description here

+0

Tuyệt vời; cám ơn rất nhiều! Mảng tôi đang tìm kiếm trong một vòng lặp, vì vậy tôi đã thêm vào một phương thức để đặt lại nó (được chỉnh sửa thành câu hỏi gốc). –

+1

@CameronSumpter Tôi nghĩ rằng vấn đề của bạn có thể là bạn đã xác định mảng của mình dưới dạng mảng chuỗi ("Dim a() As String") thay vì dưới dạng biến thể ("Dim a As Variant"). Khi tôi thay đổi thành biến thể, giải pháp của Siddharth đã làm việc cho tôi — tức là, không sử dụng Erase() và ReDim(). – litturt

0

Tín dụng cho giải pháp này đi vào this answer by Brian Hinchey. Sử dụng mã bên dưới, tôi có thể gọi IsInArray trong vòng một vòng trong Excel cho Mac 2011.

Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean 
    IsInArray = Not IsError(Application.Match(stringToBeFound, arr, 0)) 
End Function 
Các vấn đề liên quan