是否可以在vba中声明一个公共变量并分配一个默认值?

时间:2011-05-05 12:42:48

标签: vba variables default-value public variable-declaration

我想这样做,但不会编译:

Public MyVariable as Integer = 123

实现这一目标的最佳方式是什么?

9 个答案:

答案 0 :(得分:93)

.NET破坏了我们:) 您的声明对VBA无效。

只有常量才能在应用程序加载时赋予值。你声明它们是这样的:

Public Const APOSTROPHE_KEYCODE = 222

以下是我的一个vba项目的示例声明:

VBA Constant Image

如果您正在寻找声明公共变量然后想要初始化其值的内容,则需要创建一个Workbook_Open子并在那里进行初始化。 例如:

Private Sub Workbook_Open()
  Dim iAnswer As Integer

  InitializeListSheetDataColumns_S
  HideAllMonths_S

  If sheetSetupInfo.Range("D6").Value = "Enter Facility Name" Then
    iAnswer = MsgBox("It appears you have not yet set up this workbook.  Would you like to do so now?", vbYesNo)
    If iAnswer = vbYes Then
      sheetSetupInfo.Activate
      sheetSetupInfo.Range("D6").Select
      Exit Sub
    End If
  End If

  Application.Calculation = xlCalculationAutomatic
  sheetGeneralInfo.Activate
  Load frmInfoSheet
  frmInfoSheet.Show


End Sub

确保在Workbook对象中声明sub: enter image description here

答案 1 :(得分:9)

只是为你提供一个不同的角度 -

我发现在函数调用之间维护公共变量并不是一个好主意。您需要使用的任何变量都应存储在Subs和Functions中并作为参数传递。代码完成运行后,您不应期望VBA项目维护任何变量的值。

这样做的原因是,在使用工作簿时,只有大量的东西可能无意中重置了VBA项目。发生这种情况时,任何公共变量都会重置为0.

如果您需要将值存储在子函数和函数之外,我强烈建议您使用带有命名范围的隐藏工作表来获取需要保留的任何信息。

答案 2 :(得分:8)

当然你知道,但如果它是一个常数,那么const MyVariable as Integer = 123否则你的运气不好;必须在其他地方为变量分配初始值。

你可以:

public property get myIntegerThing() as integer
    myIntegerThing= 123
end property

在Class模块中,然后全局创建它;

public cMyStuff as new MyStuffClass

所以cMyStuff.myIntegerThing立即可用。

答案 3 :(得分:5)

鲜为人知的事实:
命名范围可以引用而不是特定单元格。

这可以像“全局变量”一样发挥作用,,您可以在工作表单元格和<中引用VBA 中的值/ em>在关闭并重新打开工作簿后,分配的值甚至会永久


  • 要“声明”名称 myVariable并为其分配值123

    ThisWorkbook.Names.Add "myVariable", 123
    
  • 要检索值(例如,将值显示在MsgBox中)

      MsgBox [myVariable]
    
  • 或者,您可以使用字符串引用名称 :(与方括号相同的结果)

    MsgBox Evaluate("myVariable")
    
  • 要在工作表上使用值,只需按原样在公式中使用其名称即可:

    =myVariable
    
  • 事实上,您甚至可以存储函数表达式 :(类似JavaScript中的函数)
    (不可否认,我实际上没有想到这会是有益的情况-但我也不在JS中使用它们。)

    ThisWorkbook.Names.Add "myDay", "=if(isodd(day(today())),""on day"",""off day"")"
    

方括号只是Evaluate方法的快捷方式。我听说使用它们被认为是凌乱或“ hacky”的,但是我没有遇到任何问题,Microsoft在supported中使用了它们。

也许还有一种使用Range函数来引用这些名称的方法,但是我没有看到任何好处,因此我并没有对其进行深入研究。


更多信息:

答案 4 :(得分:2)

当我需要初始化全局常量时,这就是我所做的:
1.添加一个名为Globals的模块 2.将这样的属性添加到Globals模块中:

Property Get PSIStartRow() As Integer  
    PSIStartRow = Sheets("FOB Prices").Range("F1").Value  
End Property  
Property Get PSIStartCell() As String  
    PSIStartCell = "B" & PSIStartRow  
End Property

答案 5 :(得分:1)

您可以在“常规声明”中定义变量,然后在环境中触发的第一个事件中初始化该变量。

或者,您可以创建一个具有相关属性的类,并在Initialise方法

中初始化它们

答案 6 :(得分:1)

如上所述,要声明全局可访问变量,您可以在以public关键字开头的函数之外执行此操作。

并且,由于在程序之外不允许使用效果,例如,您可以创建一个名为InitGlobals的子类来初始化您的公共变量,然后您只需在语句的开头调用此子例程

以下是一个例子:

Public Coordinates(3) as Double
Public Heat as double
Public Weight as double

Sub InitGlobals()
    Coordinates(1)=10.5
    Coordinates(2)=22.54
    Coordinates(3)=-100.5
    Heat=25.5
    Weight=70
End Sub

Sub MyWorkSGoesHere()
    Call InitGlobals
    'Now you can do your work using your global variables initialized as you wanted them to be.
End Sub

答案 7 :(得分:-2)

已经有一段时间了,但我相信它会是:

Public MyVariable as Integer
MyVariable = 123

答案 8 :(得分:-2)

已经有一段时间了,但这可能会让你满意:

Public MyVariable as Integer: MyVariable = 123

这有点难看,因为你必须重新输入变量名,但它在一行上。