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

Dav*_*vid 51 variables vba public default-value variable-declaration

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

Public MyVariable as Integer = 123
Run Code Online (Sandbox Code Playgroud)

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

ray*_*ray 103

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

在应用程序加载时,只能为常量赋值.你声明它们是这样的:

Public Const APOSTROPHE_KEYCODE = 222
Run Code Online (Sandbox Code Playgroud)

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

VBA常数图像

如果您正在寻找声明公共变量然后想要初始化其值的内容,则需要创建一个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
Run Code Online (Sandbox Code Playgroud)

确保在Workbook对象中声明sub: 在此输入图像描述

  • 为你的答案的图形/教学精神+1! (8认同)

Ala*_*ain 12

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

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

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

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


Ale*_* K. 8

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

你可以:

public property get myIntegerThing() as integer
    myIntegerThing= 123
end property
Run Code Online (Sandbox Code Playgroud)

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

public cMyStuff as new MyStuffClass
Run Code Online (Sandbox Code Playgroud)

所以cMyStuff.myIntegerThing立即可用.


ash*_*awg 6

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

这可以用作“全局变量”,另外您可以从 VBA工作表单元格中引用该值,并且在关闭并重新打开工作簿后,分配的值甚至会保持不变!



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

可能还有一种使用Range函数来引用这些名称的方法,但我没有看到任何好处,所以我没有深入研究它。


更多信息: