excel - VBA:是什么导致传递给 ParamArray 的字符串参数更改为数字(看起来可疑地像指针)?

标签 excel vba compiler-bug

最终编辑:它确实似乎是一个编译器错误 - 请参阅已接受的答案。

在 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

有趣的是,如果我如上所述调用测试例程,并使用调用“Array”产生的参数,则假定的指针值会发生变化。但是,如果我这样调用它:

call outer([{1,2,3}])

即使我多次调用电话,我也会得到相同的号码。 (如果我切换到 Windows 中的另一个应用程序,例如我的浏览器,该数字会发生变化。)所以,现在我很好奇 Excel 求值器(用方括号调用)似乎会缓存其结果...

最佳答案

这太棒了。

转载于 Office 2003。
看起来像是一个编译器错误。

问题出在这一行:

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

编译器在这里创建了一个 Variant包含一个一维数组 Variant的,其中唯一的元素是指针而不是值。然后该指针转到 strange这个函数其实并不奇怪,它只打印 Variant\Long传递给它的值。

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

Call c.strange("", (v(LBound(v))))
<小时/>

编辑

是的,这个魔数(Magic Number)是指向 VARIANT 结构的指针,该结构应该传递给 strange方法。第一个字段是8 ,即vbString ,数据字段包含指向实际字符串 "a" 的指针.

因此,这绝对是一个编译器错误...又一个关于数组的 VB 编译器错误;)

关于excel - VBA:是什么导致传递给 ParamArray 的字符串参数更改为数字(看起来可疑地像指针)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3375562/

相关文章:

java - 使用Java将10000行word文档转换为excel表格耗尽堆空间

vba - 使用 2D 数组进行 Redim

vba - 复制多个单元格范围并粘贴到另一张工作表上的宏

excel - 根据Outlook邮件更新Excel工作表

c++ - 奇怪的 constexpr typeid 错误

excel - VBA 属性 Let - 两个参数

ms-access - 是否可以从 VB6 应用程序运行 VBA 文件?

c++ - 从删除了复制构造函数的类继承

c++ - 覆盖说明符作为模板参数 - 它有效吗?

java - Apache POI、Excel 2007+ XML 和 OSGI