从表中插入数据到集合VBA访问

问题描述

我是VBA访问的新手,我想要做的是将表中的数据放入集合中,但是当我检查集合时,所有行都包含我加载的最后一行的数据。

Public Function projectStart() As Collection

    Dim cn As New ADODB.connection

    Dim rs As New ADODB.Recordset
    
    Set cn = CurrentProject.connection
    
    Dim sqlQuery As String

    Set projectStart = New Collection
    
    
    sqlQuery = "select * from p6projects"
    rs.Open sqlQuery,cn
    Do Until rs.EOF
        Dim cashFlow As New cashFlow
        
        cashFlow.letIdproject = rs!id
        cashFlow.letStartDate = rs!startDate
        cashFlow.letBlstartdate = rs!blStartDate
        projectStart.Add cashFlow
        
        rs.MoveNext
    Loop
    
    rs.Close
    Set rs = nothing
    
    cn.Close
    Set cn = nothing
    
End Function

我正在从一个表中加载10行,当我打印它们时,向我显示此行中的数据相同。

10 2/6/2019 2/6/2019
10 2/6/2019 2/6/2019
10 2/6/2019 2/6/2019
10 2/6/2019 2/6/2019
10 2/6/2019 2/6/2019
10 2/6/2019 2/6/2019
10 2/6/2019 2/6/2019
10 2/6/2019 2/6/2019
10 2/6/2019 2/6/2019
10 2/6/2019 2/6/2019

解决方法

在大多数情况下,您使用

rst!StartDate  

好吧,你要返回FIELD对象。这不是值,而是字段的实际DAO对象类型。

在“大多数”情况下,如果要强制转换为字符串,则Access在大多数情况下将自动为您执行此操作。

但是,集合可以容纳字符串或偶数对象类型。因此,在您的代码中,实际上是向字段对象添加了引用,而不是值。

因此,您需要执行以下操作:

cashFlow.letIdproject = rs!id.Value
cashFlow.letStartDate = rs!startDate.Value
cashFlow.letBlstartdate = rs!blStartDate.Value

因此,现在您将值保存到集合中,而不是对字段控件的引用。 如果您保存对该字段的引用,那么它将保存该字段列引用的所有实例所在的行。

编辑: 综上所述,实际上不需要.value。

要显示我们放入收藏夹的内容?

这将起作用: cashFlow.letIdproject = rs!ID cashFlow.letStartDate = rs!StartDate cashFlow.letBlstartdate = rs!blStartDate

Dim c As cashFlow
For Each c In projectStart
  Debug.Print c.ID,c.StartDate,c.letBlstartDate

下一步

我们的班级模块呢?好吧,我们假设这个类模块名为cashFlow。

Option Compare Database
Option Explicit
  
Public letIdproject as long
Public letStartDate as date
Public letBlstartdate as date

您必须提供有关自定义类模块外观的更多信息,但是上述代码方法应该可以使用。

,

请参见VBA: Difference in two ways of declaring a new object? (Trying to understand why my solution works)

问题在于您如何声明类对象:

Public Function projectStart() As Collection

    Dim cn As New ADODB.Connection
    Dim rs As New ADODB.Recordset
    Dim sqlQuery As String
    Dim cashFlow As cashFlow   '<<< declare outside of the loop
    
    Set cn = CurrentProject.Connection
    Set projectStart = New Collection
    sqlQuery = "select * from p6projects"
    rs.Open sqlQuery,cn
    Do Until rs.EOF
        Set cashFlow = New cashFlow  'set inside the loop
        cashFlow.letIdproject = rs!ID
        cashFlow.letStartDate = rs!StartDate
        cashFlow.letBlstartdate = rs!blStartDate
        projectStart.Add cashFlow
        rs.MoveNext
    Loop
    
    rs.Close
    Set rs = Nothing
    
    cn.Close
    Set cn = Nothing
    
End Function

最好避免在需要记住时声明变量As New,尤其是在这种情况下。