如何测试记录集中是否存在项目?

时间:2013-08-19 15:02:30

标签: vba ms-access access-vba

我有一个正在加载到记录集中的交叉表查询。然后我将查询字段写入Excel电子表格。问题是基于查询结果可能不存在字段。

例如,我有以下一行:

oSheet5.Range("F1").Value = rsB2("AK")

...它会将名为“AK”的记录集项的值写入电子表格。但如果“AK”不存在,我会收到错误Item not found in this collection

我如何测试是否有名为“AK”的项目?

我试过......

If rsB2("AK") Then
    oSheet5.Range("F" & Count).Value = rsB2("AK")
End If

......但那没用。

我也试过......

If rsB2("AK") Is Nothing Then
    oSheet5.Range("F" & Count).Value = ""
Else
    oSheet5.Range("F" & Count).Value = rsB2("AK")
End If

......仍然是同样的错误。

有50多个项目/字段要检查..美国的所有州加上一些额外的东西。 谢谢!

2 个答案:

答案 0 :(得分:4)

您可以使用Recordset.FindFirst Method (DAO)查看herehere

小例子:

Sub FindOrgName()

Dim dbs As DAO.Database
Dim rst As DAO.Recordset

'Get the database and Recordset
Set dbs = CurrentDb
Set rst = dbs.OpenRecordset("tblCustomers")

'Search for the first matching record   
rst.FindFirst "[OrgName] LIKE '*parts*'"

'Check the result
If rst.NoMatch Then
    MsgBox "Record not found."
    GotTo Cleanup
Else
    Do While Not rst.NoMatch
        MsgBox "Customer name: " & rst!CustName
        rst.FindNext "[OrgName] LIKE '*parts*'"
    Loop

    'Search for the next matching record
    rst.FindNext "[OrgName] LIKE '*parts*'"
End If

Cleanup:
    rst.Close
    Set rst = Nothing
    Set dbs = Nothing

End Sub

答案 1 :(得分:2)

你可以添加一个错误处理程序来捕获找不到错误的项目...忽略它和/或做其他事情。

或者,如果第一个记录集字段始终映射到第一个工作表列而不管字段的名称,您可以按其序号位置引用它:rsB2(0)

或者您可以在尝试检索其值之前检查记录集的Fields集合以确认字段名称是否存在。

打开记录集后,加载包含字段名称的字典。此代码示例使用后期绑定。如果你想要早期绑定,我包括评论提示。早期绑定要求您为 Microsoft Scripting Runtime 设置引用。

Dim objDict As Object 'Scripting.Dictionary
'Set objDict = New Scripting.Dictionary
Set objDict = CreateObject("Scripting.Dictionary")
Dim fld As DAO.Field

For Each fld In rsB2.Fields
    objDict.Add fld.Name, vbNullString
Next

之后您可以使用字典的Exists方法。

If objdict.Exists("AK") = True Then
    oSheet5.Range("F1").Value = rsB2("AK")
End If