【问题标题】:How to use multiple criteria with .Find in VBA?如何在 VBA 中使用 .Find 的多个条件?
【发布时间】:2013-08-02 14:15:41
【问题描述】:

我正在尝试使用 .FindLast 搜索特定记录,并且它正在使用一个条件,但是当我尝试使用具有多个条件的 .FindLast 时它停止工作。但是,我对 .FindFirst 使用几乎相同的语句并且它有效,这就是我感到困惑的原因。

我得到的错误是“标准表达式中的数据类型不匹配”。错误在于这一行:rst.FindLast ("DONOR_CONTACT_ID= 'strDonor1' AND ORDER_NUMBER= 'strOrderNum1'")。我单步执行了我的代码,但 .FindFirst ("DONOR_CONTACT_ID= 'strDonor1' and ORDER_NUMBER= 'strOrderNum1'") 行正常工作。

Option Compare Database
Option Explicit

Public dbs As DAO.Database
Public rst As DAO.Recordset
Public rstOutput As DAO.Recordset
'Defines DAO objects
Public strDonor1 As Variant
Public strDonor2 As Variant
Public strRecip1 As Variant
Public strRecip2 As Variant
Public strOrderNum1 As Variant
Public strOrderNum2 As Variant
Public strLastDonor As Variant

Function UsingTemps()

Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("T_RECIPIENT_SORT", dbOpenDynaset)
'rst refers to the table T_RECIPIENT_SORT
Set rstOutput = dbs.OpenRecordset("T_OUTPUT", dbOpenDynaset)
'rstOutput refers to the table T_OUTPUT

rst.MoveFirst
'first record
strDonor1 = rst!DONOR_CONTACT_ID
'sets strTemp1 to the first record of the DONOR_CONTACT_ID
strRecip1 = rst!RECIPIENT_CONTACT_ID
strOrderNum1 = rst!ORDER_NUMBER
rst.MoveNext
'moves to the next record

Do While Not rst.EOF
'Loop while it's not the end of the file
    strDonor2 = rst!DONOR_CONTACT_ID
    'strTemp2 = DONOR_CONTACT_ID from T_RECIPIENT_SORT
    strRecip2 = rst!RECIPIENT_CONTACT_ID
    strOrderNum2 = rst!ORDER_NUMBER
    'Sets strRecip = RECIPIENT_CONTACT_ID FROM T_RECIPIENT_SORT
    With rstOutput
    'Uses T_OUTPUT table
    If (strDonor1 = strDonor2) And (strOrderNum1 = strOrderNum2) Then
    'Runs if temps have same DONOR_CONTACT ID

            If .RecordCount > 0 Then
            'If table has records then you can check

                rst.FindLast ("DONOR_CONTACT_ID= 'strDonor1' AND ORDER_NUMBER= 'strOrderNum1'")
                strLastDonor = rst!RECIPIENT_CONTACT_ID
                If strLastDonor = strRecip2 Then
                    Call LastDonor
                Else
                    Call FirstDonor
                End If
            Else
            'No records in T_Output so needs to add first record
                .AddNew
                !DONOR_CONTACT_ID = strDonor1
                !RECIPIENT_1 = strRecip1
                !ORDER_NUMBER = strOrderNum1
                .Update
            End If
    Else
        .FindFirst ("DONOR_CONTACT_ID= 'strDonor1' and ORDER_NUMBER= 'strOrderNum1'")
        If .NoMatch Then
            .AddNew
            !DONOR_CONTACT_ID = strDonor1
            !RECIPIENT_1 = strRecip1
            !ORDER_NUMBER = strOrderNum1
            .Update
        End If

    End If
    End With
    'Slides variables down
    rst.FindFirst "[RECIPIENT_CONTACT_ID] = " & strRecip2
    strDonor1 = strDonor2
    strRecip1 = strRecip2
    strOrderNum1 = strOrderNum2
    rst.MoveNext

Loop

Call LastRecord

Set dbs = Nothing
Set rst = Nothing
Set rstOutput = Nothing

End Function

编辑:

我刚刚添加了以下代码:

Dim strFind As Variant
strFind = "DONOR_CONTACT_ID= '" & strDonor1 & "' AND ORDER_NUMBER= '" & strOrderNum1 & "'"
Debug.Print strFind
rst.FindLast strFind

它用 Debug.Print 显示这个:

DONOR_CONTACT_ID= '10136851341' AND ORDER_NUMBER= '112103071441001'

这些是 DONOR_CONTACT_ID 和 ORDER_NUMBER 的正确值,但我在 rst.FindLast strFind 行中收到错误“标准表达式中的数据类型不匹配”。可能是因为我将变量定义为变体吗?在表中,我将 DONOR_CONTACT_ID 定义为精度为 11 的十进制,RECIPIENT_CONTACT_ID 定义为精度为 11 的十进制,并将 ORDER_NUMBER 定义为精度为 15 的十进制。然后,我将代码中的变量定义为变体。您认为这可能有问题吗?

【问题讨论】:

    标签: ms-access vba dao


    【解决方案1】:

    我认为如果您更改此设置,您的故障排除工作会更容易......

    rst.FindLast ("DONOR_CONTACT_ID= 'strDonor1' AND ORDER_NUMBER= 'strOrderNum1'")
    

    到这样的事情......

    Dim strFind As String
    strFind = "DONOR_CONTACT_ID= 'strDonor1' AND ORDER_NUMBER= 'strOrderNum1'"
    Debug.Print strFind
    rst.FindLast strFind
    

    当代码抛出错误,或者根本找不到您期望的内容时,转到立即窗口 (Ctrl+g) 并检查来自 @ 的输出987654323@。您可能会立即发现问题。如果不是,请复制Debug.Print 输出,在查询设计器中打开一个新查询,切换到SQL 视图并在WHERE 子句中使用复制的文本。在这种情况下,我认为查询 SQL 可能是:

    SELECT *
    FROM T_RECIPIENT_SORT
    WHERE yadda_yadda;
    

    yadda_yadda 替换为您从“立即”窗口复制的文本。

    这更像是一般的故障排除建议。对于这个特定问题,我认为您正在构建Find 文本以包含变量的名称,而不是那些变量的。看看Debug.Print这两个字符串表达式会得到什么。

    "DONOR_CONTACT_ID= 'strDonor1' AND ORDER_NUMBER= 'strOrderNum1'"
    "DONOR_CONTACT_ID= '" & strDonor1 & "' AND ORDER_NUMBER= '" & strOrderNum1 & "'"
    

    您的代码使用了第一个,但我认为您实际上需要第二个。

    在您报告的问题更新中,DONOR_CONTACT_IDORDER_NUMBER 都是数字数据类型。在这种情况下,不要在 Find 字符串中引用这些搜索值。

    "DONOR_CONTACT_ID= " & strDonor1 & " AND ORDER_NUMBER= " & strOrderNum1
    

    【讨论】:

    • 我用添加代码时发生的情况编辑了我的问题。绝对是朝着正确方向迈出的一步,但仍然是一个错误。
    • 删除Find字符串中的引号。查看更新的答案。
    【解决方案2】:

    我们能否在 DONOR_CONTACT_ID 匹配但 ORDER_NUMBER 为 Null 的情况下丢失一些数据?我认为 Access 会抛出您从那种情况中得到的那种错误。

    除非第一次出现是罪魁祸首,否则不会在 FindFirst 上发生。

    【讨论】:

    • 感谢您的建议。我检查了我的数据并填写了所有字段,所以我不确定这是否可能是原因,除非我误解了你所说的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2014-02-12
    • 2012-08-18
    相关资源
    最近更新 更多