代码之家  ›  专栏  ›  技术社区  ›  Lee Mac

使用变量引用集合时“对象无效或不再设置”

  •  1
  • Lee Mac  · 技术社区  · 5 年前

    在回答的过程中 this question ,我编写了一个简单的函数来测试ms access表是否包含所提供数组中的所有字段:

    Function ValidateFields(strTbl As String, arrReq As Variant) As Boolean
        Dim fld
        Dim fldTmp As Field
        On Error GoTo err
        For Each fld In arrReq
            Set fldTmp = CurrentDb.TableDefs(strTbl).Fields(fld)
        Next fld
        ValidateFields = True
    err:
        Exit Function
    End Function
    
    ?ValidateFields("TempTable", Array("Field1", "Field2", "Field3"))
    False
    

    不过,为了提高效率,我尝试将fields集合分配给 For Each 循环:

    Function ValidateFields(strTbl As String, arrReq As Variant) As Boolean
        Dim fld
        Dim fldTmp As Field
        Dim colFld As Fields
        Set colFld = CurrentDb.TableDefs(strTbl).Fields
        On Error GoTo err
        For Each fld In arrReq
            Set fldTmp = colFld(fld)
        Next fld
        ValidateFields = True
    err:
        Exit Function
    End Function
    

    现在,如果我把 On Error 语句,我收到以下行错误 Set fldTmp = colFld(fld) 突出显示原因:

    运行时错误“3420”:

    对象无效或不再设置。

    为什么变量 colFld 失去它的价值 为每个人 循环?

    1 回复  |  直到 5 年前
        1
  •  4
  •   Erik A    5 年前

    这里的问题是:

    CurrentDb 创建 DAO.Database 当前打开的数据库的对象。你的 TableDef 是其中一员。

    但是,由于您没有存储该对象,因此在将tabledef复制到某个对象后,该对象会立即被关闭和解除分配,并且成员也会随之解除分配。

    存储数据库对象,成员也将保持:

    Function ValidateFields(strTbl As String, arrReq As Variant) As Boolean
        Dim fld
        Dim fldTmp As Field
        Dim colFld As Fields
        Dim db As DAO.Database
        Set db = CurrentDb
        Set colFld = db.TableDefs(strTbl).Fields
        On Error GoTo err
        For Each fld In arrReq
            Set fldTmp = colFld(fld)
        Next fld
        ValidateFields = True
    err:
        Exit Function
    End Function