Предотвращение конфликтов именования
При попытке создать или использовать ранее определенный идентификатор происходит конфликт имен. В некоторых случаях конфликты имен создают такие ошибки, как обнаружение неоднозначного имени или повторяющееся объявление в текущей области. Конфликты именования, которые не обнаружены, могут привести к ошибкам в коде, которые приводят к ошибочным результатам, особенно если перед первым использованием не объявлять все переменные явным образом.
Большинства конфликтов имен можно избежать при уверенном понимании областей видимости, а также частных и общих элементов уровня модуля.
Конфликт имен возникает в тех случаях, когда идентификатор:
- видим на нескольких уровнях области видимости;
- имеет два разных значения на одном уровне.
Например, процедуры в отдельных модулях могут иметь одинаковые имена. Таким образом, можно определить процедуру с именем MySub
в модулях с именем Mod1
и Mod2
. Если каждая процедура вызывается только из других процедур своего модуля, конфликты имен не возникают. Однако при вызове из третьего модуля может возникнуть MySub
ошибка, и не предоставляется квалификация для различия между двумя MySub
процедурами.
Большинство конфликтов имен можно разрешить, указав перед идентификатором квалификатор, который состоит из имени модуля и, при необходимости, имени проекта. Например:
YourProject.YourModule.YourSub MyProject.MyModule.MyVar
Приведенный выше код вызывает процедуру YourSub
Sub и передает в 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 и обратная связь.