0

目标:我正在构建 VBA 代码来过滤地址表SunstarAccountsInWebir_SarahTest。我想先循环看看地址是否“有效”。

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

我的问题是当我运行我的代码时它正在返回

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

(它在我将单元格的值(作为字符串)与DCount表 2 的值进行比较的行处中断)。如果我删除它周围的引号,我会得到一个不同的错误:

类型不匹配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
4

2 回答 2

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函数在第二个位置需要一个字符串参数来定义您希望“计数”的“查询”。因此出现 3078 错误。当您删除 DCount 行中的引号时[ID],您会收到 Type Mismatch 作为编译错误,因为[ID]它不是 String 或 String 变量。

解决该问题后,您可能需要重新考虑您的If陈述。!external_nmad_id除了它是一个字符串值之外,您还没有提供将包含哪种值的示例。该DCount函数将返回您告诉它计数的域(查询)中找到的行数,因此您似乎会将字符串(可能包含字母字符)与数字进行比较。DCount为了比较,Access 会将数字结果隐式转换为字符串,但如果您的!external_nmad_id字符串确实是 10 个字符或包含字母字符,它们将永远不会匹配。

于 2018-09-11T18:57:06.147 回答
0

您不能在域聚合中使用 VBA 记录集,例如DCount表/查询名称参数需要字符串文字。只需保存您的查询,然后在DCount.

SQL (另存为查询)

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

VBA

If !external_nmad_id = DCount("[ID]", "mySavedQuery") Then
   ...
End If
于 2018-09-11T18:55:00.010 回答