«Объект недействителен или больше не задан» при использовании переменной для сбора ссылок - PullRequest
1 голос
/ 15 июня 2019

В процессе ответа на этот вопрос я написал простую функцию для проверки, содержит ли таблица 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

Это работает, как и ожидалось, однако для повышения эффективности я попытался назначить коллекцию полей переменной вне цикла 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 теряет свое значение в цикле For Each?

1 Ответ

3 голосов
/ 15 июня 2019

Проблема в следующем:

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
...