Я заметил странность в VBA при использовании ParamArray
и прохождении элементов массива через него. В некоторых случаях это не значение элемента массива, которое приходит в функцию, а указатель var. (Excel 2016, 32-бит).
После некоторого зависания я обнаружил, что определение функции как варианта массива - в сочетании с списком параметров в сочетании с ParamArray
- похоже, происходит, когда происходит непредвиденное поведение, но я не вижу никаких возможных причин, по которым это было бы так,
Поведение возвращается к нормальному, когда:
1) переменная r удаляется в объявлениях функций
2) b
объявляется с помощью Dim b()
3) функция возвращает Variant
, а не Variant()
Я ценю, что это довольно эзотерический вопрос, и он, по-видимому, контролируется по-разному, но есть ли объяснение, объясняющее это поведение?
Sub Variantarraybug()
Dim b: b = [{1, 2, 3}]
Debug.Print farray1(2, b(1))(0)
Debug.Print Application.WorksheetFunction.Sum(farray1(2, b(1)))
Debug.Print Join(farray1(2, b(1)), " ")
Debug.Print farray2(2, b(1))(0)
Debug.Print Application.WorksheetFunction.Sum(farray2(2, b(1)))
Debug.Print Join(farray2(2, b(1)), " ")
Debug.Print VarPtr(b(1)), VarPtr(b(2))
End Sub
Function farray1(r, ParamArray plop()) As Variant
farray1 = Array(plop(0), 3)
End Function
Function farray2(r, ParamArray plop()) As Variant()
farray2 = Array(plop(0), 5)
End Function
Результат в окне отладки:
1
4
1 3
1
6
358808368 5
358808368 358808384
Примечание 1: Я понимаю, что функция VarPtr
возвращает местоположение памяти начального адреса памяти, требуемого этой переменной. Здесь он используется только для того, чтобы показать, что неожиданный номер (358808368), который был замечен функцией farray2
, на самом деле является адресом этого элемента.
Примечание 2: Это происходит не зависит от того, как вы создаете массив (например, b=array(1,2,3)
, b=[1,2,3]
, и т.д.), и как b
декларируется (b
, b(1 to 3)
и т.д.). Однако, если вы объявите b
с помощью Dim b()
, неожиданное поведение исчезнет. (Вы не можете напечатать VarPtr(b)
в этом случае, поскольку VarPtr
не может принимать переменные массива.)