VBA:如果使用Option Explicit在函数中定义variables的问题

我有以下问题:

Option Explicit被使用。

代码

 Function myFun( myVar as Double) as double myVar = myVar + 1 end function 

抛出myVar未定义的错误

但是,如果我将Dim myVar as Double添加Dim myVar as Double则表示variables被声明了两次。

我究竟做错了什么?

谢谢

如果在函数myFun中将Dim myVar as Double添加Dim myVar as Double ,则声明了两次。 第一次是与该行,第二行是在这里的参数:

 Function myFun( myVar as Double) as double 

这与Option Explicit没有任何关系,你不能在相同的范围内声明两个具有相同名字的variables。


我想你的代码如下所示:

 Option Explicit Public Sub TestMe() 'dim myVar as double (uncomment to avoid the error) myVar = 5 Debug.Print myFun(myVar) End Sub Function myFun(myVar As Double) As Double myVar = myVar + 1 End Function 

为了避免“未声明的错误”,您应该在Sub TestMe声明myVar ,而不是在myFun函数中声明。

根据你对Vityata的问题的评论,让我尝试一种稍微不同的解释方式。

你需要考虑variables的范围

考虑你有两个独立的程序:

程序1

 Public Sub TestMe() Dim myVar As Double myVar = 5 Debug.Print myFun(myVar) End Sub 

程序2

 Function myFun(myVar As Double) As Double myFun = myVar + 1 End Function 
  • 该模块的顶部有Option Explicit
  • 您的variables在每个过程中定义
    • variables的范围是过程
  • 因此,每个过程中需要声明每个variables。
  • 即使它们具有相同的名称,但由于variables的范围仅在过程内,因此它们不是同一个variables。

如果你想声明一个variables,并在多个过程中使用相同的variables,则需要将其声明为模块级别(例如)。

 Option Explicit Public myVar As Double Public Sub TestMe() myVar = 5 myFun myVar Debug.Print myVar End Sub Function myFun(myVar) As Double myVar = myVar + 1 End Function 

还要注意在两个不同的模块中, Function和对Function的调用是微妙的不同的。

另外,在模块级别使用Public关键字声明variables将使Project所有过程都可见。 使用Private关键字声明它将使该Module所有过程都可见。