2013-04-26 3 views
5

Я работаю на том, существующий с поддержкой макросов таблицы функционал Excel для Mac 2011.Excel для 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 для Mac 2011, я получаю сообщение об ошибке:

Runtime error '9': Subscript out of range 

Я сломал ее на части и обнаружил, что вызов UBound является то, что вызвав ошибку.

Я хотел бы как можно меньше изменить ремонтопригодность. Как я могу исправить эту ошибку для версии Mac?

Заранее благодарим за любые ответы!

Edit: решение @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. Он работает для меня совершенно нормально. Надеюсь, вы передаете массив в функцию? Можете ли вы показать мне, как вы называете эту функцию? –

ответ

4

Ok Это мое наблюдение. Если вы вызываете функцию один раз в процедуре, тогда она будет работать нормально. Для примера

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

Awesome; большое спасибо! Массив, который я искал, был в цикле, поэтому я добавил метод его сброса (отредактированный в исходный вопрос). –

+1

@CameronSumpter Я думаю, что ваша проблема, возможно, заключалась в том, что вы определили свой массив как строковый массив («Dim a() As String») вместо варианта («Dim a As Variant»). Когда я перешел на вариант, решение Сиддхарта работало для меня, т. Е. Без использования Erase() и ReDim(). – litturt

0

Кредит для этого решения идет в this answer by Brian Hinchey. Используя приведенный ниже код, я могу вызвать IsInArray в цикле в Excel для Mac 2011.

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