Как проверить существует ли объект в семействе?

У меня достаточно часто возникала ситуация, когда перед тем как обращаться к какому-либо объекту, надо было проверить - а существует ли он? Если такой объект отсутствует, то VBA возвращает ошибку:

3265
Item not found in this collection
Элемент не обнаружен в данном семействе

В общем возник закономерный вопрос: "Как лучше с этим разобраться?" Покажу решение на примере такой ситуации. 

В Access надо временно создать некий запрос, который сохраняется в семействе CurrentDb.QueryDefs. Впоследствии этот запрос используется для некоторых действий, после чего его надо удалить. То есть код должен быть примерно такой:

Set qd = CurrentDb.CreateQueryDef("zv_data")
qd.SQL = "SELECT * , 'today is " & Now() & " '" FROM my_table;"

'... используем запрос и производим "действия"...

CurrentDb.QueryDefs.Delete "zv_data"

Если в процессе работы возникнет какая-либо ошибка (допустим, пользователь банально нажал ресет на системнике, а базу не закрыл), то созданный "запрос" qd не удалится и останется в базе. Потому при попытке создать "запрос" с таким же именем будет возникать ошибка. Выходит, что перед тем как его создавать, надо проверить наличие и удалить существующий. Или изменить его.

Чтобы это проверить делаем такую функцию (можно возвести ее в ранг Public и пристроить в каком-либо модуле):

Function IsContains(col As Object, key As Variant) As Boolean
Dim obj As Object

On Error GoTo LineErr

   IsContains = True
   Set obj = col(key)
Exit Function

LineErr:

  IsContains = False

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"

Вот и все. Пока меня такое решение устраивает.

Комментарии

Популярные сообщения из этого блога

Google Apps Script - Ввод и вывод значений

Access 2007 RunTime : Разрешаем все "макросы"

Access 2007 RunTime : "Неопределенная функция Format в выражении"