【问题标题】:How to compare a recordset with For Each Value Access VBA如何将记录集与每个值访问 VBA 进行比较
【发布时间】:2022-01-18 19:47:51
【问题描述】:

此记录集需要与 For Each 内部的值进行比较:

Do While Not rs.EOF
    Debug.Print Trim(rs!CodeNr)
    rs.MoveNext
Loop

结果: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

For Each idx In td.Indexes
    If InStr(1, idx.Fields, "+ScanSpe_") = 1 Then
        Debug.Print ExtractNumber(idx.Fields)
    End If
Next

结果:1 10 11 12 13 14 15 16 2 3 4 5 6 7 8 9

如何检查这两个结果我知道哪个是匹配或不匹配?如有任何帮助,我们将不胜感激。

【问题讨论】:

  • VBA 没有提供简单的方法来做到这一点。您可以在Collection 中插入这两个列表之一的值,方法是将值指定为Add 方法中的键。然后您可以循环另一个列表并测试该集合是否包含该值。问题是如果不包含该值,该集合将引发异常。请参阅 this answer 作为解决方法。

标签: vba ms-access


【解决方案1】:

打开rsStr(rs!CodeNr) 排序,而不是在Do .. While 中,而是在For .. Next 循环中。

ts.Indexes 也是如此;使用For .. Next 循环。

然后你可以匹配第一个循环的计数器的值和第二个循环的计数器的值,并检查这两个值是否匹配。

具体如何取决于您是否希望找到匹配项或不匹配项,以及两个集合中的两个元素计数是否相等。

【讨论】:

    【解决方案2】:

    我自己试过了,这段代码运行得很好。

    Do While Not rs.EOF
        For Each idx In td.Indexes
            If InStr(1, idx.Fields, "+ScanSpe_") = 1 Then
                'Debug.Print ExtractNumber(idx.Fields)
                If ExtractNumber(idx.Fields) = Trim(rs!CodeNr) Then
                    If rs!GS1Dupli = 0 Then
                       rs.Edit
                       rs!GS1Dupli = -1
                       rs.Update
                    End If
                End If
                
            End If
        Next
        rs.MoveNext
    Loop
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    • 它可能工作正常,但它有 O(n^2) 时间复杂度
    • @OlivierJacot-Descombes 我想试试你建议的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 2020-03-21
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多