2013-08-02 31 views
1

我试图.FindLast搜索一个特定的记录,它与一个标准,但是当我试图使用.FindLast与多个标准它停止工作。然而,我用.FindFirst几乎使用了相同的语句,它的工作原理使我感到困惑。如何在VBA中使用.Find使用多个标准?

我得到的错误是“标准表达式中的数据类型不匹配”。错误是这条线:rst.FindLast(“DONOR_CONTACT_ID ='strDonor1'和ORDER_NUMBER ='strOrderNum1'”)。我通过我的代码和行.FindFirst(“DONOR_CONTACT_ID ='strDonor1'和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.F行indLast strFind。可能是因为我将变量定义为变体?在表格中,我将DONOR_CONTACT_ID定义为11精度的Decimal,将RECIPIENT_CONTACT_ID定义为10精度的Decimal,将ORDER_NUMBER定义为具有15精度的Decimal。然后我将代码中的变量定义为变体。你认为这可能有问题吗?

回答

4

我觉得你排除故障的努力将是,如果你改变这种容易...

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)并检查的输出。您可能会立即发现问题。如果不是,请复制Debug.Print输出,在查询设计器中打开一个新查询,切换到SQL View并使用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 
+0

我编辑了我添加代码时发生的事情的问题。绝对是朝着正确方向迈出的一步,但仍然是一个错误。 – nedstark179

+0

删除'Find'字符串中的引号。查看更新的答案。 – HansUp

+0

工作!再次感谢HansUp! – nedstark179

0

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

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

+0

感谢您的建议。我检查了我的数据,所有的字段都填满了,所以我不确定这是否是原因,除非我误解了你所说的内容。 – nedstark179