【问题标题】:Passing an Array of Collections as a Parameter将集合数组作为参数传递
【发布时间】:2019-07-12 17:43:13
【问题描述】:

在 Excel-VBA 上,我有一个集合数组(试图用作哈希列表),我想将它们传递给函数。

这是我最初拥有的。

Dim hashArray(200) As New Collection

populateHashArray(hashArray)
Function populateHashArray(data As Variant)
    data(2).Add "value"
End Function

每当代码触发data(2).Add "value" 行时,我都会收到以下错误:对象变量或未设置块变量。

第一次尝试修复:我尝试将函数参数从“As Variant”更改为“As Collection”

Function populateHashArray(data As Collection)
    data(2).Add "value"
End Function

这给了我一个 ByRef 不匹配

你们中的任何人都知道如何解决这个问题吗?

【问题讨论】:

    标签: arrays excel vba parameters


    【解决方案1】:

    这是在数组声明中使用New 的副作用 - 您设置了一个自动实例化情况,该情况仅适用于调用子程序,但不适用于被调用函数。

    举例说明:

    Sub Tester()
    
        Dim hashArray(200) As New Collection
    
        Debug.Print "hashArray(2) = ", TypeName(hashArray(2)) '>> Collection
    
        populateHashArray hashArray
    
    End Sub
    
    Function populateHashArray(data() As Collection)
        Debug.Print "data(1) in function = ", TypeName(data(1)) '>> Nothing
        Debug.Print "data(2) in function = ", TypeName(data(2)) '>> Collection
    End Function
    

    Tester 中引用 hashArray(2) 会在数组中的该位置自动创建一个 Collection 实例,并且它仍然存在于 populateHashArray 中。

    hashArray(1)Tester 中没有被引用,所以data(1)populateHashArray 中是空的(Nothing)。

    更多信息:What is the reason for not instantiating an object at the time of declaration?

    【讨论】:

    • 这给了我所需的信息。谢谢!