Магические брекеты в VBA Excel - PullRequest
0 голосов
/ 07 октября 2018

Я написал некоторую функцию для добавления нескольких полилиний в лист Excel.Затем я обнаружил странное поведение брекетов.Я объявляю и определяю массив точек следующим образом:

Dim points As Variant
Dim sh As Shape

points = Array(Array(10.5, 10.5), Array(20.4, 20.4), Array(5.1, 30.3), Array(10.5, 10.5))

' These both do not work and I get error about wrong type (error 1004) in 2007
' and application defined error 1004 on 2010:

ActiveWorkbook.ActiveSheet.Shapes.AddPolyline points
Set sh = ActiveWorkbook.ActiveSheet.Shapes.AddPolyline(points)

' These work fine:

ActiveWorkbook.ActiveSheet.Shapes.AddPolyline (points)
Set sh = ActiveWorkbook.ActiveSheet.Shapes.AddPolyline((points))

В чем странное волшебство скобок VBA?

Протестировано в версиях 2007 и 2010.

1 Ответ

0 голосов
/ 07 октября 2018

Дополнительные круглые скобки вокруг points приводят к тому, что аргумент оценивается как выражение и, следовательно, передается ByVal.

Акт оценки массива может точно изменить то, какданные упакованы в Variant, который их содержит (например, см. VBA: удаление дубликатов завершается неудачно, когда массив столбцов передается с использованием переменной в качестве примера), и если вызываемая процедура не очень мягко относится к типаммассивов, которые он может принять (что и должно быть), тогда это вызовет ошибку.

В вашем случае я действительно удивлен, что передача оцененного (points) даже работает, потому что в документации упоминается, что двумерный массивожидается Single s, а Array(Array(...), Array(...), ...) - зубчатый массив, в отличие от 2D-массива.Может показаться, что AddPolyline написано также для работы с неровными массивами, но распознает их только тогда, когда в варианте, содержащем массив, есть определенный набор флагов, который, по-видимому, производит оценка (например, может быть, что присутствие или отсутствие VT_BYREF отключает сравнение своего флага, поэтому он не может распознать переданный массив как поддерживаемый.

Я бы назвал это ошибкой в ​​AddPolyline, и я бы явно определил и заполнил2D массив Single чтобы избежать этого:

Dim points(1 To 4, 1 To 2) As Single
points(1, 1) = 10.5: points(1, 2) = 10.5
points(2, 1) = 20.4: points(2, 2) = 20.4
points(3, 1) = 5.1: points(3, 2) = 30.3
points(4, 1) = 10.5: points(4, 2) = 10.5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...