VBA Excel中的神奇大括号

6

我写了一些函数来向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个回答

6
额外的圆括号在points周围,导致参数被视为表达式进行求值,并因此被传递ByVal
评估数组的行为可以改变包含它的Variant中数据的精确打包方式(例如,请参见VBA:使用变量传递列数组时删除重复项失败),如果被调用的过程不非常宽容地接受各种类型的数组(应该是这样),那么它将引发错误。
在您的情况下,我实际上很惊讶传递一个经过评估的(points)甚至能够工作,因为文档提到需要一个由Single组成的2D数组,而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

感谢您的回答和阐述。最终我会按照你建议的方式来做,因为坐标来源是易于解析的文本文件。 - Yumashka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接