为什么VBA说它找到了一个“含糊不清的名字”?

时间:2013-11-27 23:30:08

标签: vba excel-vba excel

编译一些代码时(下面显示的声明)我收到错误消息'编译错误:检测到模糊名称。 SixTables'。我看过这里和其他地方,但找不到任何符合我问题的东西。似乎是这个错误的最常见原因,声明两个具有相同名称的变量或给一个函数赋予相同名称的变量以及它所调用的子变量,不适用。是的,我知道我可以将名称更改为系统满意的内容,但是(1)我不会知道我做错了什么,(2)我之所以选择这个名字是因为它适合它目的正是: - )

Option Explicit

Dim ArmOfService As Byte
Dim CharacterNumber As Long
Dim CurrentTerm As Byte
Dim DecorationRollMade As Byte
Dim DecorationRollNeeded As Byte
Dim DiceSize As Byte
Dim GenAssignment
Dim GenAssignmentSwitchInt As Byte
Dim GenAssignmentSwitchOff As Byte
Dim iLoopControl
Dim jLoopControl
Dim kLoopControl
Dim LineIncrement As Integer
Dim lLoopControl
Dim Merc(100)
Dim NoOfDice As Byte
Dim OfficerPromotion(63 To 78) As Byte
Dim PromotionRollMade As Byte
Dim PromotionRollNeeded As Byte
Dim Roll As Byte
Dim SkillColumn
Dim SixTables
Dim SpecAssignmentSwitchEnd As Byte
Dim SurvivalRollMade As Byte
Dim SurvivalRollNeeded As Byte
Dim TechLevel As Byte
Dim Temp As Integer
Dim Term As Byte
Dim TestCount
Dim UnitAssignment
Dim WhichTable
Dim Year As Byte
编辑:我很尴尬,我几乎无法解释问题所在。我知道我没有重复一个名字,因为我只使用过一次 - 作为一个功能!谢谢大家的帮助,我现在要去羞辱我的脸了......

2 个答案:

答案 0 :(得分:4)

来自MSDN:

  1. 同一范围内的多个对象可能包含元素 同名。
  2.   

    模块级标识符和项目级标识符(模块名称   但是,引用的项目名称可以在过程中重用   它使程序更难维护和调试。但是,如果你想   在同一程序中引用这两个项目,该项目具有更宽的范围   范围必须合格。例如,如果声明了MyID   模块级别的MyModule,然后是一个过程级变量   在模块中声明了相同的名称,引用了   模块级变量必须适当限定:

    Dim MyID As String 
    Sub MySub 
    MyModule.MyID = "This is module-level variable" 
    Dim MyID As String 
    MyID = "This is the procedure-level variable" 
    Debug.Print MyID 
    Debug.Print MyModule.MyID 
    End Sub 
    
    1. 在模块级别声明的标识符与过程名称冲突。
    2.   

      例如,如果声明变量MyID,则会发生此错误   模块级别,然后使用相同的名称定义过程:

      Public MyID 
      Sub MyID 
      . . . 
      End Sub 
      

答案 1 :(得分:2)

多次遇到这个问题,并没有完全理解为什么,我认为有一个重要的事实,我已经测试过,有人可以证实。对于专业程序员来说,这可能是显而易见的,但我把它放在那些在讨论中寻求这些答案的人身上,他们通常不是专业程序员。

在sub()中声明的变量不是"声明" (已分配内存),直到执行该sub()。当该sub()的执行完成时,释放内存。到目前为止,我认为公共变量的行为方式相似;可用于任何使用它的模块, - 只有在声明它们的模块仍在执行时才存在。

但是,对于任何公共变量,其声明行位于工作簿中的任何模块中,该变量在工作簿中的任何模块的执行时声明并可用,即使公共模块位于公共模块中声明存在永远不会被调用或执行

因此,如果您在一个模块中有一个Public变量声明,然后再次在一个单独的模块中,您计划独立于第一个模块运行,则Excel仍会看到同一个变量的2个声明,因此它不明确。 / p>

为了证明这一点,您可以在工作簿项目中创建一个空白模块,除了两个公共声明行之外绝对不添加任何内容,

Public VariableX as String

Public VariableY as Integer

并且对于执行的任何sub(),将在整个项目中声明和使用这些变量。这个事实也可能是关于尽量减少公共变量使用的提示的原因。

同样,这可能是专业程序员的幼儿园级别信息,但大部分内容都不是专业人员,必须通过艰难的方式或通过此类讨论板来学习这些课程。我希望这有助于某人。