问题描述
我是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
,尤其是在这种情况下。