VBA:什么导致这个stringparameter passing给ParamArray变成一个数字(看起来像一个指针可疑)?
最终编辑:它确实看起来是一个编译器错误 – 看到接受的答案。
在Excel 2007中使用VBA,我在'Class1'中有以下代码:
Option Explicit Public Function strange(dummy As String, ParamArray pa()) Debug.Print pa(LBound(pa)) End Function Public Sub not_strange(dummy As String, ParamArray pa()) Debug.Print pa(LBound(pa)) End Sub Public Function also_not_strange(ParamArray pa()) Debug.Print pa(LBound(pa)) End Function
和模块中的一些模式代码:
Option Explicit Public Function not_strange_either(dummy As String, ParamArray pa()) Debug.Print pa(LBound(pa)) End Function Public Sub outer(v) Dim c As Class1 Set c = New Class1 Call c.strange("", v(LBound(v))) Call c.not_strange("", v(LBound(v))) Call c.also_not_strange(v(LBound(v))) Call not_strange_either("", v(LBound(v))) End Sub
如果从立即窗口调用'外'这样的:
call outer(array("a"))
我回来看起来很奇怪的输出:
102085832 a a a
被调用的例程是否在一个类模块中,它是一个Sub还是一个Function,以及是否有初始参数似乎都很重要。 我是否错过了VBA如何工作? 有任何想法吗?
奇怪的数字从运行变为运行。 我说“看起来像一个指针可疑”,因为如果我这样称呼:
Public Sub outer2(v) Dim c As Class1 Set c = New Class1 Dim ind As Long For ind = LBound(v) To UBound(v) Call c.strange("", v(ind)) Next ind End Sub
像这样:
call outer2(array("a","b","c"))
我得到如下输出:
101788312 101788328 101788344
这是16的增量,让我很怀疑,但我真的不知道。 另外,通过调用一个值来传递:
Call c.strange("", CStr(v(ind)))
工作得很好。
编辑:多一点信息…如果我把“c.strange”的返回值赋值给某个东西,而不是把它扔掉,我得到相同的行为:
Public Sub outer3(v) Dim c As Class1 Set c = New Class1 Dim x x = c.strange("", v(LBound(v))) Call c.not_strange("", v(LBound(v))) Call c.also_not_strange(v(LBound(v))) Call not_strange_either("", v(LBound(v))) End Sub
有趣的是,如果我像上面那样调用我的testing例程,并且调用“Array”引起的参数,那么假定的指针值会发生变化。 但是,如果我这样称呼它:
call outer([{1,2,3}])
即使重复拨打电话,我也可以回到相同的号码。 (如果我切换到Windows中的另一个应用程序,如我的浏览器,数字会发生变化。)所以,现在我很感兴趣的是,Excel评估程序(用括号调用)似乎caching了其结果…
现在这真棒。
转载于Office 2003。
看起来像一个编译器错误。
问题在于这一行:
Call c.strange("", v(LBound(v)))
这里编译器创build一个Variant
,它包含Variant
一维数组,其中唯一的元素是一个指针而不是值。 这个指针然后去strange
function,这实际上并不奇怪,它只打印传递给它的Variant\Long
值。
这个技巧使编译器恢复了理智:
Call c.strange("", (v(LBound(v))))
编辑
是的,这个幻数是一个指向VARIANT结构的指针,它应该被传递给strange
方法。 其中第一个字段是8
,它是vbString
,数据字段包含一个指向实际string"a"
的指针。
因此,这绝对是一个编译器错误…另一个VB编译器错误的数组方面;)