代码之家  ›  专栏  ›  技术社区  ›  Singularity20XX

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

  •  3
  • Singularity20XX  · 技术社区  · 8 年前

    我有一个包含许多表的数据库,我正试图检查给定表中是否有空值。我不是为每个表编写函数,而是试图将表名和字段名作为字符串传递给一个函数(这样一个函数就可以在所有表上工作)。

    我可以用表名来完成这个任务,但不能用字段名来完成。我收到“此集合中找不到项”的运行时错误

    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
    

    “局部变量”窗口显示两个字符串都已传递,但我仍然得到运行时错误。我忽略了什么吗?

    2 回复  |  直到 8 年前
        1
  •  3
  •   Andre    8 年前

    要在这些情况下使用变量,请使用括号:

    If IsNull(myTable(fieldName)) Then
    

    但请注意,更有效的方法是使用查询:

    x = DCount("*", tableName, "[" & fieldName & "] IS NULL")
    
        2
  •  2
  •   Mathieu Guindon    8 年前
    foo!bar
    

    这个符号是“bang符号”。这个 bar 部分 与普通标识符类似,但对于VBA来说,它是一个字符串文本——这就是为什么您不能这样做的原因:

    If IsNull(myTable![ & fieldName & ]) Then
    

    bang符号 foo!bar 相当于 foo.DefaultItemPropertyWithStringIndexer("bar").DefaultProperty . 所以:

    If IsNull(myTable.Fields(fieldName).Value) Then
    

    应该工作得很好。较短的 myTable(fieldName) 符号完全相同,除了所有这些显式成员调用都是隐式的。我个人更喜欢这样的代码 说它做什么 照上面说的做 .

    然而,就进入而言, using a query to query a table 是前进的道路。

    推荐文章