Предотвращение конфликтов именования

При попытке создать или использовать ранее определенный идентификатор происходит конфликт имен. В некоторых случаях конфликты имен создают такие ошибки, как обнаружение неоднозначного имени или повторяющееся объявление в текущей области. Конфликты именования, которые не обнаружены, могут привести к ошибкам в коде, которые приводят к ошибочным результатам, особенно если перед первым использованием не объявлять все переменные явным образом.

Большинства конфликтов имен можно избежать при уверенном понимании областей видимости, а также частных и общих элементов уровня модуля.

Конфликт имен возникает в тех случаях, когда идентификатор:

  • видим на нескольких уровнях области видимости;
  • имеет два разных значения на одном уровне.

Например, процедуры в отдельных модулях могут иметь одинаковые имена. Таким образом, можно определить процедуру с именем MySub в модулях с именем Mod1 и Mod2. Если каждая процедура вызывается только из других процедур своего модуля, конфликты имен не возникают. Однако при вызове из третьего модуля может возникнуть MySub ошибка, и не предоставляется квалификация для различия между двумя MySub процедурами.

Большинство конфликтов имен можно разрешить, указав перед идентификатором квалификатор, который состоит из имени модуля и, при необходимости, имени проекта. Например:

YourProject.YourModule.YourSub MyProject.MyModule.MyVar

Приведенный выше код вызывает процедуру YourSubSub и передает в MyVar качестве аргумента. Используйте любое сочетание квалификаторов для различения идентичных идентификаторов.

Visual Basic сопоставляет каждую ссылку на идентификатор с ближайшим объявлением соответствующего идентификатора. Например, если MyIDобъявлен общедоступным в двух модулях в проекте (Mod1 и Mod2), можно указать MyID объявленное в Mod2 без квалификации из Mod2, но необходимо указать его, чтобы Mod2.MyID указать его в Mod1.

Это также верно, если Mod2 объект находится в другом проекте, на который ссылается напрямую. Однако если Mod2 объект находится в проекте с косвенной ссылкой, то есть в проекте, на который ссылается проект, на который вы ссылаетесь напрямую, ссылки на Mod2 переменную с именем MyID должны всегда указываться именем проекта. Если вы ссылаетесь на MyID третий модуль с прямой ссылкой, совпадение выполняется с первым объявлением, встречаемым при поиске:

  • Проекты напрямую ссылаются в том порядке, в который они отображаются в диалоговом окне Ссылки меню Сервис .
  • Модули каждого проекта. Обратите внимание, что строгий порядок модулей в проекте отсутствует.

Использовать имена объектов ведущего приложения, например, R1C1 в Microsoft Excel, на других уровнях области видимости нельзя.

Совет

Типичные ошибки, связанные с конфликтом имен: неоднозначные имена, повторяющиеся объявления, необъявленные идентификаторы или ненайденные процедуры. Начиная каждый модуль с оператором Option Explicit для принудительного объявления переменных перед их использованием, можно избежать некоторых потенциальных конфликтов именования и ошибок, связанных с идентификаторами.

См. также

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.