在 VBA MS ACCESS 中使用 DAO 记录集数据填充数组

Posted

技术标签:

【中文标题】在 VBA MS ACCESS 中使用 DAO 记录集数据填充数组【英文标题】:Populate array with a DAO recordset data in VBA MS ACCESS 【发布时间】:2020-01-29 13:57:37 【问题描述】:

我想做什么

我想要一个循环,如果产品的存储位置不适合他的存储位置,它会删除该产品的存储位置。在这个循环中,我想将 artikelDetail_ID 保存在一个数组中。循环结束后,我希望能够看到在循环期间被删除并放入数组中的所有 artikelDetail_ID。

代码运行时会删除 6 条记录。

我的解决方案

Dim verwijderdeID() As Variant
Dim lengte As Integer
lengte = 0
With recordset_opslag_detail_info
    Do Until recordset_opslag_detail_info.EOF
        If (huidige_doos_max_aantal - huidige_doos_inhoud >= 0) Then
            Exit Do
        End If
        ReDim verwijderdeID(lengte)
        verwijderdeID(lengte) = recordset_opslag_detail_info!ArtikelDetail_ID
        lengte = lengte + 1
        huidige_doos_inhoud = huidige_doos_inhoud - recordset_opslag_detail_info!Voorraadperartikel
        .Edit
        !tmea_opslag_locatie = Null
        .Update
        recordset_opslag_detail_info.MoveNext
    Loop
    End With

Dim i As Integer
For i = 0 To UBound(verwijderdeID)
    MsgBox verwijderdeID(i)
Next

问题

当我的代码找到多于一条记录时,它只会保护数组中的最后一条记录。如果我按照示例尝试使用记录集中的 6 个值填充数组,则只有 verwijderID(5) 会有一个值。

我在 VBA 中尝试做的事情是不可能的吗?

【问题讨论】:

Redim 删除数组中的值,Redim Preserve 保留这些值。我认为这应该可以解决您的问题。一些额外信息:docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/… @Beek 不错。 @Beek 现在可以使用了。谢谢! 请注意,Redim Preserve 具有不断增加的数组是一种反模式。它会比必要的慢很多,因为它会为每次迭代重新分配和复制数组。改用Collection,没有这个问题。 如果我的数据集总是少于 10 条记录。如果我使用Collection而不是ReDim,会有很大的时间优势吗? 【参考方案1】:

当您要更改其大小的数组包含您要保留的数据时,请使用Redim Preserve

Redim 本身也会改变大小,但它也会擦除数组中的所有数据。

您可以阅读更多关于它的信息here.


接下来你想改变你的线路:

ReDim verwijderdeID(lengte)

ReDim Preserve verwijderdeID(lengte)

【讨论】:

以上是关于在 VBA MS ACCESS 中使用 DAO 记录集数据填充数组的主要内容,如果未能解决你的问题,请参考以下文章

MS Access DAO 连接在退出时放弃更改

在 Access 中使用 ODBC 连接到 MS SQL Server 2012:手动调用查询和在 VBA 中调用查询之间的巨大时间差异

Excel 工作表名称不允许使用 VBA 将数据导入 Access - DAO

使用 Access 2010 数据库的 Excel 2010 VBA DAO 查询不起作用

VBA (Ms-Access) 从宏调用成员函数

有啥方法可以在 DAO 和 MS Access 中使用长文本(备忘录)参数?