【问题标题】:Populating a Collection VBA MS Access - Reference Issue填充集合 VBA MS 访问 - 参考问题
【发布时间】:2025-12-05 23:30:01
【问题描述】:

在 MS Access 的 VBA 中填充集合时遇到问题。

这是我的代码:

Private Sub loadInfo()
    Dim sql As String
    sql = "SELECT * FROM table2';"

    Set db = CurrentDb
    Set rs = db.OpenRecordset(sql)

    With rs
        .MoveFirst
        While rs.EOF = False

            Dim person As New person
            Dim idToString As String
            idToString = rs.Fields("ID").value

            person.setFirstName (rs.Fields("first_name").value)
            person.setLastName (rs.Fields("last_name").value)

            people.Add person, idToString

            .MoveNext
        Wend
    End With
End Sub

集合在类模块的顶部被声明为初始化。我可以很好地添加项目。但是,在 Sub 的末尾,我最终得到了一个包含适量对象的集合(无论我在 Recordset 中有多少),但它们都具有相同的名字和姓氏。

现在,我认为每次“when”循环运行时,其中的变量都会超出范围,从而变为空。在这种情况下,情况似乎并非如此。每次返回到person.setFirstName 时,集合中已有项目的firstName 都会更改为新行的当前firstNamelastName 也是如此。

这让我相信 person 并不是在每次循环运行时都被创建,这给了我一个相似条目的集合,除了它们的唯一键。

关于如何让循环按应有的方式执行的任何想法?

【问题讨论】:

  • 我会将循环内的变量声明移动到函数的顶部。我会用Set person = new Person 代替它。
  • 这里是。谢谢你,DiegoAndresJAY。

标签: vba ms-access while-loop


【解决方案1】:

集合是键值对列表。它不能有多个维度。

尝试使用用户定义类型:

在模块声明中...

Public Type Person
    FirstName As String
    LastName As String
End Type

在表单声明中...

Dim typPerson() As Person

然后像这样使用...

ReDim typPerson(0 To rs.RecordCount - 1) As Person

Dim i As Integer
Do While Not rs.EOF
    With typPerson(i)
        .FirstName = rs!FirstName
        .LastName = rs!LastName
    End With
    i = i + 1
    rs.MoveNext
Loop

【讨论】:

  • 您所解释的或多或少是我通过基于类模块person 声明一个新对象所做的。
【解决方案2】:

在您的子 loadinfo() 中,插入以下行: “设置人=无”,之前 “.MoveNext”。 如果你不这样做,相同的项目会一直添加到集合中。 高温

【讨论】: