Как заставить VBA/Access требовать переменные для определения?

Я делаю некоторые существенные изменения для некоторого кода VBA, а некоторые переменные удаляются и/или переименовываются. Было бы намного легче найти все места, которые мне нужно обновить, если компилятор мне пожаловал бы, что переменные не существуют, а не создают их на лету.

Как заставить VBA/Access требовать, чтобы переменные были объявлены?

Ответы

Ответ 1

Вам нужно использовать Option Explicit в верхней части каждого модуля кода VBA, включая формы и отчеты.

Вы можете установить это для всех будущих созданных модулей и кода VBA позади форм и отчетов, перейдя в редактор VBA → Инструменты → Параметры → Вкладка "Редактор" и проверка "Требовать переменную декларацию".

Из справки Access 2003:

Требовать объявление переменной. Определяет, нужны ли явные объявления переменных в модулях. Выбор этого добавляет оператор Option Explicit к общим объявлениям в любом новом модуле.

Я также использую случай верблюда, когда я меняю свои переменные. ThisIsAnExampleOfCamelCase. Как только я выйду из строки кода VBA, если Access не изменит переменную нижнего регистра на случай верблюда, я знаю, что у меня есть опечатка.

Ответ 2

Некоторая история в OPTION EXPLICIT и Access VBA

Чтобы узнать ответ от Tony, объясните, почему существуют проблемы с OPTION EXPLICIT, которые не входят в некоторые модули кода доступа.

В Access 95 и Access 97 (первые две версии Office с VBA) у Access был другой редактор кода, чем другие офисные программы. В Access 2000 Microsoft внедрила VBE из других приложений Office в Access. В то же время MS решила, что модули доступа VBA ведут себя как модули в других приложениях, которые по умолчанию не имеют OPTION EXPLICIT.

Таким образом, в Access 2000 по умолчанию модули были созданы без OPTION EXPLICIT.

Это было, конечно, действительно глупое дизайнерское решение для части MS, и они изменили ее позже (я не помню, был ли Access 2002 или 2003, который исправил проблему и по умолчанию снова заменил OPTION EXPLICIT во всех новых модулях). Причина, по которой она была немой (и MS должна была это знать), заключается в том, что Access является инструментом DATABASE APPLICATION DEVELOPMENT и, таким образом, работает с данными, которые строго типизированы. Таким образом, среда кода должна быть строго типизирована по умолчанию, чтобы она соответствовала данным, с которыми она работает.

В Excel или Word данные не сильно типизированы, и поэтому имеет смысл использовать варианты типов данных практически для всего, просто для того, чтобы сделать его проще для всех. Недостатком реализации этого, не используя OPTION EXPLICIT, является то, что вы можете в конечном итоге опечатать, который автоматически вводит новые переменные [такие как переменная "intrdoduce" - если бы я писал этот пост с OPTION EXPLICIT, это не произошло бы без создавая ошибку времени выполнения!:)]. Это проблема со всеми такими языками, которые работают таким образом (я вытаскиваю свои волосы из PHP, где имена переменных могут быть разными в зависимости от случая, т.е. $Var - это не та же переменная, что и $var, но я отвлекаюсь), но MS решила реализовать его таким образом в Word и Excel по теории, что люди, пишущие код, будут иметь более легкое время, если они не будут вынуждены объявлять свои переменные.

Итак, MS допустила ошибку, сделав версию доступа VBE, как и другие приложения, даже несмотря на отсутствие внутренней логики доступа к собственным целям, которые поддерживали этот ход. Затем MS отменила это изменение и вернулась к предыдущему статус-кво (т.е. OPTION EXPLICIT по умолчанию во всех модулях).

Таким образом, вы часто будете видеть приложения, которые начали жизнь в Access 2000 с модулями по всему миру без OPTION EXPLICIT. Когда мне нужно работать с таким приложением, моя первая задача - реализовать OPTION EXPLICIT во всех модулях, а затем исправить проклятую вещь, чтобы она скомпилировалась (что часто довольно сложно, учитывая, что вещь была запрограммирована без него).