【问题标题】: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 中,则数组会填充。 有什么想法吗?

【问题讨论】:

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

标签: arrays vba module vb6 public


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-17
      • 1970-01-01
      • 2019-08-16
      • 1970-01-01
      • 2016-04-22
      • 2014-04-05
      • 1970-01-01
      相关资源
      最近更新 更多