如何在VBA中设置全局变量

时间:2019-07-15 06:17:17

标签: excel vba

我想在一个模块的VBA中定义一个全局变量,并在其他VBA模块中使用它。

我正在尝试关注:How do I declare a global variable in VBA?

我创建了一个名为“ GlobalVariables”的新模块,然后首先声明了Public变量,然后在函数中设置了它们的值(尝试在开放代码中执行此操作会导致错误)。我的代码如下。

但是Global变量StartYear在其他VBA模块中似乎不可用。我在做什么错了?

Option Explicit

Public StartYear As Integer
Public BaseYear As Integer

Function DeclareGlobalVariables()
    StartYear = ActiveWorkbook.Worksheets("RunModel").Range("StartYear").Value
    BaseYear = ActiveWorkbook.Worksheets("RunModel").Range("BaseYear").Value
End Function

1 个答案:

答案 0 :(得分:1)

  1. 确保将golobal变量放在模块中而不是在工作表范围中,以使其在其他模块中可访问。

  2. 您的Function应该是Sub,因为它不会返回任何内容。

  3. 如果您的单元格例如,您的代码将错误。包含文本(字符串)。永远不要相信用户的输入。 始终验证!

所以我建议以下内容

模块1

Option Explicit

Public StartYear As Long
Public BaseYear As Long

Public Sub DeclareGlobalVariables()
    With ActiveWorkbook.Worksheets("RunModel").Range("StartYear")
        If IsYear(.Value) Then
            StartYear = CLng(.Value)
        Else
            MsgBox "StartYear needs to be a number"
        End If
    End With

    With ActiveWorkbook.Worksheets("RunModel").Range("BaseYear")
        If IsYear(.Value) Then
            BaseYear = CLng(.Value)
        Else
            MsgBox "BaseYear needs to be a number"
        End If
    End With
End Sub

'validate if the input value is a valid year
Private Function IsYear(ByVal InputValue As Variant) As Boolean
    If IsNumeric(InputValue) Then
        If CLng(InputValue) = InputValue And _
           InputValue > 0 And InputValue < 9999 Then 'integer not decimal AND 4 digit year
            IsYear = True
        End If
    End If
End Function

您可以在任何其他模块中访问变量,例如:

模块2

Option Explicit

Public Sub TestOutput()
    Debug.Print StartYear
    Debug.Print BaseYear
End Sub