为什么我的代码在没有'Option Explicit'的情况下运行但是失败了?

时间:2013-11-16 03:08:55

标签: excel-vba vba excel

我正在构建我在VBA的第一个主要程序(在SO的帮助下)。它的开头是下面的,我正在以尽可能结构化的方式添加代码块。在阅读了使用'Option Explicit'的重要性之后,我插入了它并开始声明我的所有变量。运行该程序给出了'编译错误:变量未定义'。

我已经尝试删除并重新输入声明,以防问题是由我在代码启动后添加'Option Explicit'引起的,以及删除UDF并重新添加,但没有成功。

注释掉“Option Explicit”会消除错误消息,后续的代码块将完全按照设计运行。

编辑:我应该说'iLoopControl'总是会出现错误。

Option Explicit

'UDF to roll a number of Dice of specified size and total them
  Function Dice(NoOfDice, DiceSize)
    Dice = 0
      For iLoopControl = 1 To NoOfDice
        Dice = Dice + WorksheetFunction.RandBetween(1, DiceSize)
      Next
  End Function

Sub MercOne()

Randomize

Dim Merc(86)
Dim Temp As Integer, TechLevel As Byte, ArmOfService As Byte
Dim Year As Byte, YearCount As Byte
Dim GenAssignment As Variant, UnitAssignment As Variant
Dim SpecAssignmentSwitchEnd As Byte, Roll As Byte
Dim Rank As Variant, NoOfDice As Variant, DiceSize As Byte
Dim GenAssignmentSwitchInt As Byte, GenAssignmentSwitchOff As Byte
Dim CharacterNumber As Long, iLoopControl As Long

3 个答案:

答案 0 :(得分:3)

我赞赏你使用Option Explicit!现在你必须学会​​好好利用它......

您必须在使用它之前声明变量 。在声明之前,您在函数iLoopControl中使用Dice。 VBA将假设(没有Option Explicit)你只是懒惰,并为你创建一个Variant变量。但是如果你拼错了变量名,它会创建一个新的 - 并且调试会非常困难,因为你不会理解为什么值是错误的......

顺便说一句,一般来说,避免使用Variant是个好主意,除非您知道变量可以包含不同的类型,何时在For Each循环中使用它,或者何时使用它是函数中的可选参数。它比“常规类型”变量慢,占用更多空间。在较大的程序中可以有所作为。如果您确实需要Variant,则不需要说As Variant,因为这是隐含的。

关于代码的另一点:您在iLoopControl范围中声明Sub。这意味着当你不在那个潜艇中时,它是未知的(和“未声明的”)。甚至当你进入从该子调用的函数内部时也是如此。在Sub / Function中可以“看到”的唯一变量是在模块级别(在子/函数之外)声明的变量,或子变量中的变量本身。

答案 1 :(得分:1)

Option Explicit表示您必须在使用之前显式声明所有变量及其类型。如果您不包含Option Explicit声明,则VBA只会在遇到新标识符时创建Variant类型变量。

例如,如果您已声明Dim iLoopControl as Integer,则需要包含Option Explicit

Option Explicit    
Dim iLoopControl As Integer
For iLoopControl = 1 To NoOfDice
   Dice = Dice + WorksheetFunction.RandBetween(1, DiceSize)
Next

如果您未包含Option Explicit,则可以使用iLoopControl而不使用Dim iLoopControl as Integer来声明它。

答案 2 :(得分:1)

  1. 您需要在使用之前声明变量
  2. End Sub的{​​{1}}位置