Передача массивов через ParamArray с пользовательскими функциями - PullRequest
0 голосов
/ 19 января 2020

Новый для VBA. У меня две проблемы со следующим кодом для пользовательских функций. Я не могу понять, как передавать массивы через ParamArray.

1) Напечатанный тип из bool () - 8203, как и должно быть. Но напечатанный тип из test () - 8204, поэтому они являются нулевыми или недействительными. Редактировать: было указано, что 8204 - это тип Variant.

2) Я не уверен если я правильно вызываю элементы из вложенных массивов с помощью «A (0) (1,1)». Я не могу печатать или вызывать значения из A () функции Test ().

В формуле ячейки:

=Test(bool())

В редакторе VBA:

Function Test(ParamArray A() As Variant)
    Debug.Print VarType(A)
    Debug.Print A(0)(1,1)
    Test = A(0)(1, 1)
End Function

Function bool()
    Dim out() As Boolean
    Dim u As Integer, v As Integer

    ReDim out(1 To 3, 1 To 2)
    For v = 1 To 2
        For u = 1 To 3
            out(u, v) = True
        Next u
    Next v

    Debug.Print VarType(out)
    bool = out
End Function

ParamArray необходим, я просто не демонстрирую, почему в этом примере.

Ответы [ 3 ]

1 голос
/ 19 января 2020

8204 - это ожидается , потому что ParamArray A() As Variant - это вариант массив .

vbVariant = 12
vbArray = 8192

8192 + 12 = 8204

0 голосов
/ 19 января 2020

Проблема была исправлена ​​удалением Debug.Print A (0). И исправив еще одну опечатку, которой не было в исходном посте.

0 голосов
/ 19 января 2020

У вас есть две проблемы: первая A (0) является параметром 1, а содержимое отсутствует (u, v), поэтому debug.print A (0) выдаст ошибку, вторая ваша функциональная проверка без возвращаемого значения и для выполнения кода являются следующие:

Function Test(ParamArray A() As Variant)
    msgbox "1" & ubound(A)
    Debug.Print A(0)(1, 1)
    Test = A(0)(1, 1)
    msgbox "2" & ubound(A)
End Function

Function bool()
    Dim out() As Boolean
    Dim u As Integer, v As Integer

    ReDim out(1 To 3, 1 To 2)
    For v = 1 To 2
        For u = 1 To 3
            out(u, v) = True
        Next u
    Next v

    Debug.Print VarType(out)
    bool = out
End Function
...