避免命名冲突
尝试创建或使用之前已定义的标识符时发生命名冲突。 在某些情况下,命名冲突会生成错误,例如 检测到不明确的名称 或 当前范围内的重复声明。 未检测到的命名冲突可能会导致代码中产生错误结果的 bug,尤其是在首次使用之前未显式声明所有 变量 时。
命名冲突可在标识符具有以下情形时出现:
- 在多个范围级别中可见。
- 在相同的级别具有两个不同的含义。
例如,不同的模块中的过程可能具有系统的名称。 因此,可在名为 MySub
和 Mod1
的模块中定义名为 Mod2
的过程。 如果仅从每个过程自己的模块中的其他过程调用该过程,则不会发生任何冲突。 但是,如果 MySub
从第三个模块调用 ,并且未提供用于区分这两 MySub
个过程的限定,则可能会出现错误。
大部分命名冲突的解决方法是在每个标识符前附加由模块名称和项目名称(如果必要)组成的限定符。 例如:
YourProject.YourModule.YourSub MyProject.MyModule.MyVar
The preceding code calls the Sub procedure YourSub
and passes MyVar
as an argument. 使用限定符的任意组合来区分相同的标识符。
Visual Basic matches each reference to an identifier with the "closest" declaration of a matching identifier. 例如,如果在MyID
项目中的两个模块中声明为 Public (Mod1
和 Mod2
) ,则可以在 Mod2
中指定MyID
声明Mod2
的 ,但必须将其限定为 Mod2.MyID
,才能在 中Mod1
指定它。
如果 Mod2
位于其他但直接 引用的项目中,则也是如此。 但是,如果 Mod2
位于间接引用的项目中,即由直接引用的项目引用的项目,则必须始终使用项目名称限定对名为 MyID
的Mod2
变量的引用。 If you reference MyID
from a third, directly referenced module, the match is made with the first declaration encountered by searching:
不可重新使用主机应用程序对象的名称,例如不同范围级别的 Microsoft Excel 中的 R1C1。
提示
Typical errors caused by naming conflicts include ambiguous names, duplicate declarations, undeclared identifiers, and procedures that are not found. 通过使用 Option Explicit 语句开始每个模块以强制使用变量的显式声明,可以避免一些潜在的命名冲突和与标识符相关的 bug。
另请参阅
支持和反馈
有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。