访问 VBA 运行-time error 3078, or Type Mismatch on DCount function
Access VBA Run-time error 3078, or Type Mismatch on DCount function
Objective:我正在构建 VBA 代码来过滤地址 table SunstarAccountsInWebir_SarahTest。我想先循环一下,看看地址是不是"valid"。
- 如果无效 – 导出到不同的 table。
- 如果有效 – 它会在 "valid" 地址行中输入另一个嵌套的 if/then:
- 如果他们的 ID,external_nmad_id 匹配第二个 table 1042s_FinalOutput_7 ,我想更新第二个 table box13c_Address 中的其中一列。
- 如果它与第二个 table 的 ID 不匹配 – 它将导出到另一个 table.
我的问题是当我 运行 我的代码返回时
Run-Time error 3078: cannot find table or query
(它在我将单元格的值(作为字符串)与 table 2 的 DCount
进行比较的行处中断)。如果我删除它周围的引号,我会得到一个不同的错误:
Type mismatch against the DCount
我觉得我错过了一些简单但又说不清是什么的东西。如何让我的代码将 !external_nmad_id
中调用的字符串值与我的字符串中调用的 table 的其余部分相匹配? 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
您不能在像 DCount
这样的域聚合中使用 VBA 记录集,因为 table/query 名称参数需要字符串文字。只需保存您的查询,然后在 DCount
.
中按名称引用它
SQL (另存为查询)
SELECT RIGHT(IRSfileFormatKey, 10) As ID FROM 1042s_FinalOutput_7;
VBA
If !external_nmad_id = DCount("[ID]", "mySavedQuery") Then
...
End If
问题是 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 函数在第二个位置需要一个字符串参数来定义您希望 "Count" 的 "query"。因此出现 3078 错误。当您删除 DCount 行中 [ID]
周围的引号时,您会收到类型不匹配作为编译错误,因为 [ID]
不是字符串或字符串变量。
解决该问题后,您可能需要重新考虑您的 If
声明。您没有提供 !external_nmad_id
将包含什么样的值的示例,除了它是一个 String 值这一事实。 DCount
函数将 return 您告诉它计算的域(查询)中找到的行数,因此看起来您将比较一个字符串(可能包含字母字符)到一个数字。为了进行比较,Access 会将 DCount
数值结果隐式转换为字符串,但如果您的 !external_nmad_id
字符串确实是 10 个字符或包含字母字符,它们将永远不会匹配。
Objective:我正在构建 VBA 代码来过滤地址 table SunstarAccountsInWebir_SarahTest。我想先循环一下,看看地址是不是"valid"。
- 如果无效 – 导出到不同的 table。
- 如果有效 – 它会在 "valid" 地址行中输入另一个嵌套的 if/then:
- 如果他们的 ID,external_nmad_id 匹配第二个 table 1042s_FinalOutput_7 ,我想更新第二个 table box13c_Address 中的其中一列。
- 如果它与第二个 table 的 ID 不匹配 – 它将导出到另一个 table.
我的问题是当我 运行 我的代码返回时
Run-Time error 3078: cannot find table or query
(它在我将单元格的值(作为字符串)与 table 2 的 DCount
进行比较的行处中断)。如果我删除它周围的引号,我会得到一个不同的错误:
Type mismatch against the
DCount
我觉得我错过了一些简单但又说不清是什么的东西。如何让我的代码将 !external_nmad_id
中调用的字符串值与我的字符串中调用的 table 的其余部分相匹配? 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
您不能在像 DCount
这样的域聚合中使用 VBA 记录集,因为 table/query 名称参数需要字符串文字。只需保存您的查询,然后在 DCount
.
SQL (另存为查询)
SELECT RIGHT(IRSfileFormatKey, 10) As ID FROM 1042s_FinalOutput_7;
VBA
If !external_nmad_id = DCount("[ID]", "mySavedQuery") Then
...
End If
问题是 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 函数在第二个位置需要一个字符串参数来定义您希望 "Count" 的 "query"。因此出现 3078 错误。当您删除 DCount 行中 [ID]
周围的引号时,您会收到类型不匹配作为编译错误,因为 [ID]
不是字符串或字符串变量。
解决该问题后,您可能需要重新考虑您的 If
声明。您没有提供 !external_nmad_id
将包含什么样的值的示例,除了它是一个 String 值这一事实。 DCount
函数将 return 您告诉它计算的域(查询)中找到的行数,因此看起来您将比较一个字符串(可能包含字母字符)到一个数字。为了进行比较,Access 会将 DCount
数值结果隐式转换为字符串,但如果您的 !external_nmad_id
字符串确实是 10 个字符或包含字母字符,它们将永远不会匹配。