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


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

Public MyVariable as Integer = 123

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


40
2018-05-05 12:42


起源


这个VBA在哪里运行? Excel,Access,Word ...... - Duncan Howe
@DuncanHowe我希望有一个通用的vba解决方案。 - David
全局变量不再被视为邪恶吗?我五月份离开了几个星期,所以我可能错过了一些东西。 - Jean-François Corbett


答案:


.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


84
2018-05-05 13:48



为你的答案的图形/教学精神+1! - CaBieberach


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

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

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

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


9
2018-05-05 14:04





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

你可以:

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

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

public cMyStuff as new MyStuffClass

所以 cMyStuff.myIntegerThing 立即可用。


5
2018-05-05 12:53



更好的是添加一个模块并在此模块中定义这些属性。我创建了一个名为的模块 Globals 并定义 Property Get在这个模块中,它就像一个魅力。物业获取PSIStartRow()作为整数PSIStartRow =表格(“FOB价格”)。范围(“F1”)。价值结束物业物业获取PSIStartCell()作为字符串PSIStartCell =“B”&PSIStartRow End Property - Achilles
代码在上面的评论中被破坏了。我会在下面发布它。 - Achilles


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

或者,您可以创建一个具有相关属性的类,并在Initialise方法中初始化它们


1
2018-05-05 12:55





如上所述,要声明全局可访问变量,您可以在使用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

1
2017-08-11 11:20





当我需要初始化全局常量时,这就是我所做的:
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

1
2017-07-11 12:15





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

Public MyVariable as Integer
MyVariable = 123

-2
2018-05-05 12:52



这不编译我恐怕。看起来已经太久了! - David
Specificly, Public 声明必须是 外 惯例(Sub 要么 Function),价值分配 内。 - RolandTumble