2013-04-26 10 views
5

pracuję na co istniejąca makr arkusza kalkulacyjnego Excel na funkcjonalne dla Mac 2011.Excel 2011 dla komputerów Mac: Ubound() nie działa

Mam funkcji (Source), który przeszukuje tablice dla określonej wartości :

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

to działa doskonale w programie Excel 2013, ale w programie Excel 2011 dla komputerów Mac, otrzymuję błąd:

Runtime error '9': Subscript out of range 

złamałem go od siebie i stwierdził, że jest to, co wezwanie Ubound powoduje błąd.

Chciałbym zmienić jak najmniej możliwości konserwacji. Jak mogę naprawić ten błąd dla wersji na Maca?

Z góry dziękuję za wszelkie odpowiedzi!

Edit: rozwiązanie @Siddharth trasa jest na miejscu, ale ponieważ szukałem tablic w pętli, musiałem zmodyfikować pętlę zresetować tablicę między każdej iteracji następująco (w przypadku gdy ktoś inny prowadzi do tego samego wydanie!):

' --- 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

Właśnie przetestowałem to w programie Excel 2011. Działa to dla mnie absolutnie dobrze. Mam nadzieję, że przekazujesz tablicę do funkcji? Czy możesz mi pokazać, jak nazywasz tę funkcję? –

Odpowiedz

4

OK To jest moja obserwacja. Jeśli wywołasz funkcję raz w procedurze, to będzie działać poprawnie. Dla przykładu

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

Jednak jeśli nazywają go dwa razy w procedurze wtedy pojawia się błąd Runtime error '9': Subscript out of range. Może to błąd programu 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

Rozwiązanie

Odtworzono tablicy. Zobacz ten przykład.

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

Awesome; Dzięki wielkie! Tablica, którą szukałem, była w pętli, więc dodałem metodę resetowania jej (edytowaną na oryginalne pytanie). –

+1

@CameronSumpter Myślę, że twoim problemem mogło być to, że zdefiniowałeś swoją tablicę jako tablicę ciągów ("Dim a() jako ciąg") zamiast jako wariant ("Dim jako warianty"). Kiedy zmieniłem wariant, rozwiązanie Siddharth'a działało dla mnie - tj. Bez użycia funkcji Erase() i ReDim(). – litturt

0

kredytowe dla tego rozwiązania idzie this answer by Brian Hinchey. Korzystając z poniższego kodu, mogę wywołać funkcję IsInArray w pętli w programie Excel 2011 dla komputerów Mac.

Function IsInArray(stringToBeFound As String, arr As Variant) As Boolean 
    IsInArray = Not IsError(Application.Match(stringToBeFound, arr, 0)) 
End Function 
Powiązane problemy