将表名和字段名作为字符串传递给函数

时间:2018-07-18 18:45:00

标签: vba ms-access access-vba

我有一个包含许多表的数据库,并且我正在尝试检查给定表的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窗口显示两个字符串都已传递,但是我仍然遇到运行时错误。我在俯视什么吗?

2 个答案:

答案 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是必经之路。