访问VBA运行时错误3078,或DCount函数的类型不匹配

时间:2018-09-11 18:25:48

标签: sql access-vba dcount

目标:我正在构建VBA代码以通过地址表 SunstarAccountsInWebir_SarahTest 进行过滤。我想先遍历一下,看看地址是否为“有效”。

  • 如果无效–导出到其他表。
  • 如果有效-在“有效”地址行内输入另一个嵌套if / then:
    • 如果其ID external_nmad_id 与第二个表 1042s_FinalOutput_7 的ID相匹配,我想更新第二个表 box13c_Address 。
    • 如果它与第二个表的ID不匹配–它将被导出到另一个表中。

我的问题是,当我运行代码时,它会返回

  

运行时错误3078:找不到表或查询

(在我将单元格(作为字符串)的值与表2的DCount进行比较的那一行处中断了)。如果删除引号,则会出现其他错误:

  

类型与DCount

不匹配

我觉得我缺少了一些简单的东西,但无法说出什么。如何获取代码以将!external_nmad_id中调用的字符串值与字符串中调用的表的其余部分进行匹配? DCount("[ID]", StrSQL1)

Public Sub EditFinalOutput2()

'set variables
Dim i As Long
Dim qs As DAO.Recordset
Dim ss As DAO.Recordset
Dim StrSQL1 As DAO.Recordset
Dim IRSfileFormatKey As String
Dim external_nmad_id As String
Dim nmad_address_1 As String
Dim nmad_address_2 As String
Dim nmad_address_3 As String
Dim mytestwrite As String

'open reference set
Set db = CurrentDb
Set qs = db.OpenRecordset("SunstarAccountsInWebir_SarahTest")
'Set ss = db.OpenRecordset("1042s_FinalOutput_7")
'Set StrSQL1 = db.OpenRecordset("SELECT RIGHT(IRSfileFormatKey, 10) As ID 
'FROM 1042s_FinalOutput_7;")

With qs.Fields
intCount = qs.RecordCount - 1
For i = 0 To intCount

    If (IsNull(!nmad_address_1) Or (!nmad_address_1 = !nmad_city) Or (!nmad_address_1 = !Webir_Country) And IsNull(!nmad_address_2) Or (!nmad_address_2 = !nmad_city) Or (!nmad_address_2 = !Webir_Country) And IsNull(!nmad_address_3) Or (!nmad_address_3 = !nmad_city) Or (!nmad_address_3 = !Webir_Country)) Then
    DoCmd.RunSQL "INSERT INTO Addresses_ToBeReviewed SELECT SunstarAccountsInWebir_SarahTest.* FROM SunstarAccountsInWebir_SarahTest WHERE (((SunstarAccountsInWebir_SarahTest.external_nmad_id)='" & qs!external_nmad_id & "'));"

    Else:
        Set ss = db.OpenRecordset("1042s_FinalOutput_7")
        Set StrSQL1 = db.OpenRecordset("SELECT RIGHT(IRSfileFormatKey, 10) As ID FROM 1042s_FinalOutput_7;")
        If !external_nmad_id = DCount("[ID]", StrSQL1) Then
                ss.Edit
                ss.Fields("box13c_Address") = qs.Fields("nmad_address_1") & qs.Fields("nmad_address_2") & qs.Fields("nmad_address_3")
                ss.Update

        Else:   DoCmd.SetWarnings False
                DoCmd.RunSQL "INSERT INTO Addresses_NotUsed SELECT SunstarAccountsInWebir_SarahTest.* FROM SunstarAccountsInWebir_SarahTest WHERE (((SunstarAccountsInWebir_SarahTest.external_nmad_id)='" & qs!external_nmad_id & "'));"
                DoCmd.SetWarnings True
        End If

    End If

qs.MoveNext
Next i

End With

'close reference set
qs.Close
Set qs = Nothing
ss.Close
Set ss = Nothing

End Sub

2 个答案:

答案 0 :(得分:1)

问题在于DCount函数不能直接对Recordset进行操作。

您正在将StrSQL1声明为RecordSet对象,并根据您的Select语句将其设置为RecordSet。

Set StrSQL1 = db.OpenRecordset("SELECT RIGHT(IRSfileFormatKey, 10) As ID FROM 1042s_FinalOutput_7;")

然后,您尝试将此RecordSet传递给DCount函数,该函数不能接受RecordSet对象作为Domain参数。正如您在MSDN中所看到的,DCount函数在第二个位置需要一个String参数来定义您希望“计数”的“查询”。因此出现3078错误。当您在DCount行中的[ID]周围删除引号时,由于[ID]不是String或String变量,您会得到Type Mismatch作为编译错误。

解决该问题后,您可能需要重新考虑您的If语句。您没有提供!external_nmad_id包含哪种类型的样本,只是它是一个字符串值。 DCount函数将返回在域(查询)中找到的要计数的行数,因此看来您正在将字符串(可能包含字母字符)与数字进行比较。为了进行比较,Access将隐式将DCount数字结果转换为字符串,但是如果您的!external_nmad_id字符串确实是10个字符或包含字母字符,则它们将永远不匹配。

答案 1 :(得分:0)

您不能在DCount之类的域集合内使用VBA记录集,因为表/查询名称参数需要字符串文字。只需保存查询,然后在DCount中按名称进行引用即可。

SQL (另存为查询)

SELECT RIGHT(IRSfileFormatKey, 10) As ID FROM 1042s_FinalOutput_7;

VBA

If !external_nmad_id = DCount("[ID]", "mySavedQuery") Then
   ...
End If