最终编辑:它确实看起来是一个编译器错误-请参阅接受的答案。
在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
如果从即时窗口调用“outer”,如下所示:
call outer(array("a"))
102085832
a
a
a
被调用的例程是否在类模块中,它是子例程还是函数,以及是否有初始参数,似乎都很重要。我是否遗漏了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
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
call outer([{1,2,3}])
即使我反复打电话,我也会得到相同的号码(如果我在Windows中切换到另一个应用程序(如浏览器),数字会发生变化。)因此,现在我很感兴趣的是,Excel evaluator(用括号调用)似乎在缓存其结果。。。