Как проверить существует ли объект в семействе?
У меня достаточно часто возникала ситуация, когда перед тем как обращаться к какому-либо объекту, надо было проверить - а существует ли он? Если такой объект отсутствует, то VBA возвращает ошибку:
3265
Item not found in this collection
Элемент не обнаружен в данном семействе
В общем возник закономерный вопрос: "Как лучше с этим разобраться?" Покажу решение на примере такой ситуации.
В Access надо временно создать некий запрос, который сохраняется в семействе CurrentDb.QueryDefs. Впоследствии этот запрос используется для некоторых действий, после чего его надо удалить. То есть код должен быть примерно такой:
qd.SQL = "SELECT * , 'today is " & Now() & " '" FROM my_table;"
'... используем запрос и производим "действия"...
Если в процессе работы возникнет какая-либо ошибка (допустим, пользователь банально нажал ресет на системнике, а базу не закрыл), то созданный "запрос" qd не удалится и останется в базе. Потому при попытке создать "запрос" с таким же именем будет возникать ошибка. Выходит, что перед тем как его создавать, надо проверить наличие и удалить существующий. Или изменить его.
Чтобы это проверить делаем такую функцию (можно возвести ее в ранг Public и пристроить в каком-либо модуле):
Function IsContains(col As Object, key As Variant) As Boolean
Dim obj As Object
On Error GoTo LineErr
Set obj = col(key)
Exit Function
LineErr:
End Function
В итоге получаем:
If IsContains(CurrentDb.CreateQueryDef, "zv_data") Then
CurrentDb.QueryDefs.Delete "zv_data"
End If
Set qd = CurrentDb.CreateQueryDef("zv_data")
qd.SQL = "SELECT * , 'today is " & Now() & " '" FROM my_table;"
'... используем запрос и производим "действия"...
CurrentDb.QueryDefs.Delete "zv_data"
Вот и все. Пока меня такое решение устраивает.
Комментарии
Отправить комментарий