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一维数组,其中唯一的元素是一个指针而不是值。 这个指针然后去strangefunction,这实际上并不奇怪,它只打印传递给它的Variant\Long值。

这个技巧使编译器恢复了理智:

 Call c.strange("", (v(LBound(v)))) 

编辑

是的,这个幻数是一个指向VARIANT结构的指针,它应该被传递给strange方法。 其中第一个字段是8 ,它是vbString ,数据字段包含一个指向实际string"a"的指针。

因此,这绝对是一个编译器错误…另一个VB编译器错误的数组方面;)