我有一个包含许多表的数据库,并且我正在尝试检查给定表的Null值。我没有为每个表编写一个函数,而是尝试将表名和字段名作为字符串传递给一个函数(以便一个函数可在所有表上使用)。
我可以使用表名来完成此操作,但不能使用字段名来完成。我收到“在此集合中找不到项目”的运行时错误
Public myDb As DAO.Database
Public myTable As DAO.Recordset
Public Sub verifyFields()
checkNull "Table Name", "Field Name"
End Sub
Public Sub checkNull(ByVal tableName As String, ByVal fieldName As String)
Set myDb = CurrentDb
'============
'Table Name | 'Check if Column "Field Name" for null values
'============
Set myTable = CurrentDb.OpenRecordset(tableName)
myTable.MoveFirst
Do Until myTable.EOF
If IsNull(myTable![ & fieldName & ]) Then'<--Error is thrown here
x = x + 1
blanksFound = True
End If
myTable.MoveNext
Loop
If blanksFound = True Then
aaa = MsgBox(x & " Blanks found.", vbOKOnly, blankField.Name)
End If
locals窗口显示两个字符串都已传递,但是我仍然遇到运行时错误。我在俯视什么吗?
答案 0 :(得分:3)
要在这些情况下使用变量,请使用括号:
If IsNull(myTable(fieldName)) Then
但是请注意,更有效的方法是使用查询:
x = DCount("*", tableName, "[" & fieldName & "] IS NULL")
答案 1 :(得分:2)
foo!bar
此符号是“爆炸符号”。 bar
部分看起来就像一个普通标识符,但是对于VBA来说,它是一个字符串文字-这就是为什么您不能这样做:
If IsNull(myTable![ & fieldName & ]) Then
爆炸符号foo!bar
等效于foo.DefaultItemPropertyWithStringIndexer("bar").DefaultProperty
。所以:
If IsNull(myTable.Fields(fieldName).Value) Then
应该可以正常工作。较短的myTable(fieldName)
表示法是完全相同的,除了所有这些显式成员调用均是隐式的。我个人更喜欢说明其作用并且执行其内容的代码。
就Access而言,using a query to query a table是必经之路。