2013-04-26 60 views
5

我正在做Excel的一個現有的啓用宏的電子表格功能的Mac 2011的Excel for Mac 2011中:UBound函數()不工作

我有一個函數(Source),搜索陣列的指定值:

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

它完全在Excel 2013,但是用Excel for Mac 2011中,我收到錯誤:

Runtime error '9': Subscript out of range 

我除了把它弄壞了,發現UBound函數調用是什麼導致錯誤。

我想盡可能少地改變可維護性。我該如何解決Mac版本的這個錯誤?

在此先感謝您的回覆!

編輯: @Siddharth潰敗的解決方案是發現,但因爲我是一個循環內進行搜索的陣列,我不得不修改循環如下到每次迭代之間的陣列復位(如果任何人運行到同一個問題!):

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

剛剛在Excel 2011中進行了測試。它對我來說絕對好。希望你傳遞一個數組到一個函數?你能告訴我你是如何調用這個功能的? – 2013-04-26 17:03:30

回答

4

好的這是我的觀察。如果您在程序中調用該函數一次,那麼它將正常工作。例

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

但是,如果你在程序調用它兩次,然後你會得到一個錯誤Runtime error '9': Subscript out of range。也許這是一個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

重新創建陣列。看到這個例子。

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

太棒了;非常感謝!我搜索的數組是在一個循環中,所以我添加了一個重置​​它的方法(編輯成原始問題)。 – 2013-04-26 21:26:55

+1

@CameronSumpter我認爲你的問題可能是你的數組定義爲一個字符串數組(「Dim a()As String」)而不是變體(「Dim a As Variant」)。當我改變爲變體時,Siddharth的解決方案爲我工作,即不使用Erase()和ReDim()。 – litturt 2015-09-11 17:44:07

0

信用這個解決方案去this answer by Brian Hinchey。使用下面的代碼,我可以在Excel for Mac 2011中的循環內調用IsInArray。

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