从模块访问公共变体数组

Posted

技术标签:

【中文标题】从模块访问公共变体数组【英文标题】:Accessing Public Variant Array from Module 【发布时间】:2014-11-10 12:12:58 【问题描述】:

假设我在 Visual Basic 6 项目中有两个文件 Form1.frm 和 Module1.bas。

Form1.frm:

Public myArray As Variant

Private Sub Form_Load()
  ReDim myArray(2)
  Call PopulateArrays
End Sub

模块1.bas:

Public Sub PopulateArrays()
Form1.myArray(0) = Array(1, 2, 3)
Form1.myArray(1) = Array(4, 5, 6)
Form1.myArray(2) = Array(7, 8, 9)
End Sub

问题是一旦代码运行,'myArray' 仍然是空的。 如果我将 PopulateArrays Sub 放在主 Form1.frm 中,则数组会填充。 有什么想法吗?

【问题讨论】:

代码是否只发布了不起作用的变体? 通常在表单中有公共数组时会出现问题,“...数组,...不允许作为对象模块的公共成员”。我很惊讶你没有遇到它。既然这应该是个问题,或许可以尝试将数组移动到模块中。 【参考方案1】:

我看到您使用了一种解决方法来让您的 Form1 保存一个公共数组。但是,我认为更好的解决方案是:(A) 将数组移动到模块并使其公开 (B) 为其创建 accessor/mutator functions。

如果您不同时保留多个表单实例,那么 (A) 是最简单的解决方案。

这是我为 (A) 测试的代码, 表格:

Private Sub UserForm_Initialize()
    Call PopulateArrays
    Call displayArray
End Sub

Private Sub displayArray()
    Dim v1 As Variant
    Dim s As String

    For Each v1 In myArray
        s = s + Join(v1, ", ") + vbNewLine
    Next v1
    MsgBox s
End Sub

模块:

Dim form1 As UserForm1
Public myArray As Variant

Public Sub start()
    Set form1 = New UserForm1
End Sub

Public Sub PopulateArrays()
    ReDim myArray(2)
    myArray(0) = Array(1, 2, 3)
    myArray(1) = Array(4, 5, 6)
    myArray(2) = Array(7, 8, 9)
End Sub

【讨论】:

【参考方案2】:

有些东西你不能在对象模块中声明(用户窗体只是特殊的对象模块),其中之一是数组。如果你声明了

Public myArray() As Variant

然后你会得到一个编译错误,它说的很多并且会知道。但是由于您声明为 Variant,编译器没有抱怨,但赋值不起作用。

一种选择是使 Variant 数组私有并使用属性语句(这是 VBA,但对于 VB6 应该相同)。在用户表单中

Private mmyArray() As Variant

Public Property Get myArray() As Variant
    myArray = mmyArray
End Property

Public Property Let myArray(lmyArray As Variant)
    mmyArray = lmyArray
End Property


Private Sub UserForm_Click()

    MsgBox Join(Me.myArray(0), "_")

End Sub

Private Sub UserForm_Initialize()

    ReDim mmyArray(2)
    PopulateArrays

End Sub

在标准模块中

Public Sub PopulateArrays()

    Dim ar(0 To 2) As Variant

    ar(0) = Array(1, 2, 3)

    UserForm1.myArray = ar

End Sub

【讨论】:

以上是关于从模块访问公共变体数组的主要内容,如果未能解决你的问题,请参考以下文章

从用户窗体 vba 加载的公共数组

如何在 javascript 中访问多维 PHP 数组作为 json 编码的变体?

尝试调用外部 VBA 函数时,只能强制在公共对象模块中定义的用户定义类型

为啥模块中的这个公共函数无法访问

什么是耦合关系?

在 Kotlin 中如何从不同的模块访问内部成员