доступ: как определить с VBA, открыт ли запрос? - PullRequest
5 голосов
/ 22 октября 2010

возможно ли определить, существует ли открытый запрос с использованием VBA в access-2007?

Я открываю запрос, подобный этому:

    stDocName = "Meeting_Reasons_Frequency"
  DoCmd.OpenQuery stDocName

можно ли определить, открыт ли он?

Ответы [ 3 ]

8 голосов
/ 22 октября 2010

Как насчет:

 If SysCmd(acSysCmdGetObjectState, acQuery, "QueryName") = acObjStateOpen Then

Подробнее: http://msdn.microsoft.com/en-us/library/aa205281(office.10).aspx

1 голос
/ 15 апреля 2019

SysCmd(acSysCmdGetObjectState, acQuery, "QueryName") возвращает ноль, если QueryName закрыто или не существует.

В противном случае возвращается сумма констант для следующих условий:

  • acObjStateOpen (1) открыть в любом состоянии (новый, грязный и т. Д.) Или в виде (Дизайн, таблица данных и т. Д.)
  • acObjStateDirty (2) открыть, но с несохраненными изменениями дизайна
  • acObjStateNew (4) новый запрос, который еще не был сохранен в его родительской коллекции (QueryDefs)

Возможно, большую часть времени проверяет, является ли выражение SysCmd= acObjStateOpen будет достаточно.Однако, если вы хотите избежать неожиданности, когда запрос открыт с несохраненными изменениями дизайна, вы можете And acObjStateOpen, как pianoJames предложил .

Но если вы намерены что-то сделать, когда QueryName открыто, вы можете просто проверить, не закрыто ли оно (ноль):

If SysCmd(acSysCmdGetObjectState, acQuery, "QueryName") <> 0 Then
1 голос
/ 27 февраля 2017

Не уверен, относится ли это к запросам, но я заметил, что для форм следует использовать And вместо =.

If SysCmd(acSysCmdGetObjectState, acForm, "FormName") And acObjStateOpen Then

Очевидно, что форма может иметь несколько «состояний» одновременно.Использование And выбирает тот, который вы хотите;в этом контексте он действует как побитовый оператор.

...