2013-04-26 62 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