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