代码之家  ›  专栏  ›  技术社区  ›  jtolle

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

  •  9
  • jtolle  · 技术社区  · 14 年前

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

    在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(用括号调用)似乎在缓存其结果。。。

    1 回复  |  直到 14 年前
        1
  •  9
  •   GSerg    14 年前

    这太棒了。

    转载于office 2003。

    问题在于:

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

    在这里,编译器创建一个 Variant 的,唯一的元素是指针而不是值。然后该指针指向 strange Variant\Long 传递给它的值。

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

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

    编辑

    是的,这个幻数是一个指向变量结构的指针,它应该传递给 奇怪的 方法。第一个字段是 8 vbString ,数据字段包含指向实际字符串的指针 "a"

    因此,它肯定是一个编译器错误。。。关于数组的另一个VB编译器错误;)

    推荐文章