VBA:如果使用Option Explicit,则在函数中定义变量时出现问题

时间:2017-10-25 10:39:13

标签: excel vba excel-vba basic

我有以下问题:

Option Explicit已被使用。

代码

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

抛出myVar未定义的错误

但是,如果我添加行Dim myVar as Double,则表示该变量被声明两次。

我做错了什么?

由于

2 个答案:

答案 0 :(得分:3)

如果您在函数Dim myVar as Double中添加myFun,则会将其声明两次。第一次是该行,第二行是参数:

Function myFun( myVar as Double) as double

这与Option Explicit没有任何关系,不允许在同一范围内声明两个具有相同名称的变量。

我想您的代码如下所示:

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

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

答案 1 :(得分:1)

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

您需要考虑变量的范围

请考虑您有两个独立的程序:

程序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
  • 您的变量在每个程序中定义
    • 变量的范围是程序
  • 因此,需要在每个过程中声明每个变量。
  • 即使它们具有相同的名称,由于变量的范围仅在过程中,因此它们不是相同的变量。

如果要声明变量,并使其在多个过程中具有相同的变量,则需要将其声明为模块级别(例如)。

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和对函数的调用略有不同。

另外,在模块级别使用Public关键字声明变量将使Project中的所有过程都可以看到该变量。使用Private关键字对其进行声明会使Module中的所有过程都可以看到它。