【问题标题】:Excel for Mac 2011: UBound() Not WorkingExcel for Mac 2011:UBound() 不工作
【发布时间】:2013-04-20 22:18:53
【问题描述】:

我正在努力使现有的启用宏的电子表格在 Excel for Mac 2011 上运行。

我有一个函数 (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 Rout 的解决方案是正确的,但由于我在循环中搜索数组,我不得不修改循环以在每次迭代之间重置数组,如下所示(以防其他人遇到同样的问题!):

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

【问题讨论】:

  • 刚刚在 Excel 2011 中对其进行了测试。它对我来说非常好用。希望您将数组传递给函数?你能告诉我你是怎么调用这个函数的吗?

标签: arrays excel vba macos


【解决方案1】:

此解决方案的功劳归于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

【讨论】:

    【解决方案2】:

    好的,这是我的观察。如果您在过程中调用该函数一次,那么它将正常工作。例如

    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
    

    但是,如果您在该过程中调用它两次,则会收到错误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
    

    解决方案

    重新创建数组。请参阅此示例。

    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
    

    【讨论】:

    • 太棒了;非常感谢!我正在搜索的数组在一个循环中,所以我添加了一个重置​​它的方法(编辑到原始问题中)。
    • @CameronSumpter 我认为您的问题可能是您将数组定义为字符串数组(“Dim a() As String”)而不是变体(“Dim a As Variant”)。当我更改为变体时,Siddharth 的解决方案对我有用——即,不使用 Erase() 和 ReDim()。
    猜你喜欢
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多