将未扩展的数组传递给VB6的Ubound函数将导致错误,因此我想在检查其上限之前检查它是否已被标注尺寸.我该怎么做呢?
我注意到在使用ParamArray和传递数组元素时VBA有些奇怪.在某些情况下,它不是数组元素的值到达函数,而是var指针.(Excel 2016,32位).
在经历了一些沉闷之后,我发现函数作为变量数组的定义 - 与参数列表结合使用ParamArray- 似乎是意外行为的起源,但我看不出任何可行的原因,为什么会这样.
在以下情况下,行为恢复正常:
1)在函数声明中删除变量r
2)b声明Dim b()
3)函数返回a Variant,而不是aVariant()
我理解这是一个相当深奥的问题,它似乎可以通过各种方式控制,但是有没有解释这种行为的解释?
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) …Run Code Online (Sandbox Code Playgroud) 在为某个对象类型声明了一个数组(其中该类型不使用从COM的接口派生的接口(&因此未正确设置以启用[OLE] Automation的后期绑定技术))后,尝试根据我的期望将数组分配给变量不起作用。IDispatchVariant
具体而言,似乎发生的情况是将指向数组的积分指针分配给了Variant变量,而不是数组的副本。
谁能解释这种行为?这是VBA 7.1语言的标准行为吗?[EDIT-A1]是VBA的Variant类型不能处理此类数组吗?[EDIT-A2]
[EDIT-A1]- 当前(19年4月6日),看起来像是个错误。
[EDIT-A2]- 否,因为ByRef Variant如果将这样的数组作为此类参数的值传递,则参数的内部过程参数可以正确指向此类数组。
有关正在发生的事情的更多详细信息
在检查了各种内存地址和指针之后,似乎正在发生的事情是,在将此类数组分配给Variant变量时,实际上是分配了指向数组“ VB安全数组指针”的Long(或LongPtr)指针。这与VBA语言规范中此处记录的预期的行为相反。在查看有关VB数组及其内存布局的VB6文档(存储在此处)之后,我推断出发生了这种指针分配。
我对问题是否先前已被记录的研究
我搜索了Internet,Office VBA参考文档和VBA语言规范,以查看是否有人记录了此问题。我发现该问题可能已被部分记录的唯一地方是在此处发布的堆栈溢出答案中。不幸的是,该帖子没有对这个问题说太多。
我测试过的特定数组类型
我曾经历过与使用接口不下列对象类型的数组这个问题获得来自IDispatch:
stdole.IUnknown *stdole.IFontmscoree.CorRuntimeHost †mscorlib.AppDomain †mscorlib.Type*来自的OLE Automation COM类型库stdole2.tlb。
†来自.NET Framework v4.0.30319的COM类型库。
关于使用不源自的接口的对象类型的更多信息 …