避免命名冲突

尝试创建或使用之前已定义的标识符时发生命名冲突。 在某些情况下,命名冲突会生成错误,例如 检测到不明确的名称当前范围内的重复声明。 未检测到的命名冲突可能会导致代码中产生错误结果的 bug,尤其是在首次使用之前未显式声明所有 变量 时。

可通过了解范围、私有模块级和公共模块级避免大部分命名冲突。

命名冲突可在标识符具有以下情形时出现:

  • 在多个范围级别中可见。
  • 在相同的级别具有两个不同的含义。

例如,不同的模块中的过程可能具有系统的名称。 因此,可在名为 MySubMod1 的模块中定义名为 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 (Mod1Mod2) ,则可以在 Mod2中指定MyID声明Mod2的 ,但必须将其限定为 Mod2.MyID ,才能在 中Mod1指定它。

如果 Mod2 位于其他但直接 引用的项目中,则也是如此。 但是,如果 Mod2 位于间接引用的项目中,即由直接引用的项目引用的项目,则必须始终使用项目名称限定对名为 MyIDMod2变量的引用。 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 支持和反馈,获取有关如何接收支持和提供反馈的指南。