为什么VBA说它找到了一个';名称不明确';?

为什么VBA说它找到了一个';名称不明确';?,vba,excel,Vba,Excel,在编译某些代码(如下所示的声明)时,我会收到错误消息“Compile error:检测到不明确的名称”。“六桌”。我看了这里和其他地方,但找不到任何符合我的问题。导致此错误的最常见原因是,声明两个名称相同的变量,或为函数及其调用源赋予相同的名称,这些都不适用。是的,我知道我可以把名字改成系统满意的名字,但是(1)我不知道我做错了什么,(2)我选择这个名字是有原因的——它完全符合它的目的:-) 编辑:我很尴尬,几乎无法解释问题出在哪里。我知道我没有复制一个名字,因为我只使用了一次——作为一个函数!

在编译某些代码(如下所示的声明)时,我会收到错误消息“Compile error:检测到不明确的名称”。“六桌”。我看了这里和其他地方,但找不到任何符合我的问题。导致此错误的最常见原因是,声明两个名称相同的变量,或为函数及其调用源赋予相同的名称,这些都不适用。是的,我知道我可以把名字改成系统满意的名字,但是(1)我不知道我做错了什么,(2)我选择这个名字是有原因的——它完全符合它的目的:-)

编辑:我很尴尬,几乎无法解释问题出在哪里。我知道我没有复制一个名字,因为我只使用了一次——作为一个函数!谢谢大家的帮助,我现在要去掩面了…

来自MSDN:

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

  • 在模块级别声明的标识符与过程名称冲突
  • 例如,如果变量MyID在 模块级,然后用相同的名称定义一个过程:


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

    在sub()中声明的变量在该sub()执行之前不会被“声明”(内存分配)。当sub()的执行完成时,内存被释放。到目前为止,我认为公共变量的作用方式类似;可用于任何使用它的模块,但仅在声明它们的模块仍在执行时才存在

    但是,对于工作簿中任何模块中声明行的任何公共变量,该变量在工作簿中任何模块执行时声明并可用,,即使从未调用或执行存在公共声明的模块

    因此,如果在一个模块中有一个公共变量声明,然后又在计划独立于第一个模块运行的单独模块中,Excel仍然会看到同一个变量的两个声明,因此它是不明确的

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


    作为字符串的公共变量X

    作为整数的公共变量


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


    同样,这可能是专业程序员的幼稚园级信息,但大多数都不是专业人士,必须通过艰苦的方式或通过类似这样的讨论板来学习这些课程。我希望这有助于其他人。

    我假设更改名称确实可以解决您的帖子中的问题?您是否有使用该名称的代码模块?显然,从您提供的代码中,我们可以很容易地看出没有问题。您需要提供更多的代码和可能的所有组合,即模块名称、子名称、函数名称等。使用CTRL+F扫描代码并搜索
    SixTables
    Keiran。但是我没有其他同名的东西。你能用一个新项目重复这个问题吗?两年后,这个解决方案真的帮了我的忙。感谢您花时间回复。
    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
    
    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 
    
    Public MyID 
    Sub MyID 
    . . . 
    End Sub