Dav*_*vid 51 variables vba public default-value variable-declaration
我想这样做,但它不会编译:
Public MyVariable as Integer = 123
实现这一目标的最佳方法是什么?
ray*_*ray 103
.NET破坏了我们:)你的声明对VBA无效.
在应用程序加载时,只能为常量赋值.你声明它们是这样的:
Public Const APOSTROPHE_KEYCODE = 222
这是我的一个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
确保在Workbook对象中声明sub:

Ala*_*ain 12
只为你提供一个不同的角度 -
我发现在函数调用之间维护公共变量并不是一个好主意.您需要使用的任何变量都应存储在Subs和Functions中并作为参数传递.代码运行完毕后,您不应期望VBA项目维护任何变量的值.
这样做的原因是,在使用工作簿时,只有大量的东西可能无意中重置了VBA项目.发生这种情况时,任何公共变量都会重置为0.
如果您需要将值存储在子函数和函数之外,我强烈建议您使用带有命名范围的隐藏工作表来获取需要保留的任何信息.
当然你知道,但如果它是一个常数,那么const MyVariable as Integer = 123否则你的运气不好; 必须在其他地方为变量分配初始值.
你可以:
public property get myIntegerThing() as integer
    myIntegerThing= 123
end property
在Class模块中,然后全局创建它;
public cMyStuff as new MyStuffClass
所以cMyStuff.myIntegerThing立即可用.
这可以用作“全局变量”,另外您可以从 VBA和工作表单元格中引用该值,并且在关闭并重新打开工作簿后,分配的值甚至会保持不变!
要“声明”名称 myVariable并为其分配值123:
ThisWorkbook.Names.Add "myVariable", 123
检索值(例如在 a 中显示值MsgBox):
  MsgBox [myVariable]
或者,您可以使用字符串来引用名称:(相同的结果为方括号)
MsgBox Evaluate("myVariable")
要使用工作表上的值,只需在公式中按原样使用它的名称:
=myVariable
事实上,你甚至可以存储函数表达式:(有点像在JavaScript 中)
(诚然,我实际上想不出有什么好处 - 但我也不在 JS 中使用它们。)
ThisWorkbook.Names.Add "myDay", "=if(isodd(day(today())),""on day"",""off day"")"
方括号只是Evaluate方法的快捷方式。我听说使用它们被认为是混乱或“hacky”,但我没有遇到任何问题,并且Microsoft支持在 Excel 中使用它们。
可能还有一种使用Range函数来引用这些名称的方法,但我没有看到任何好处,所以我没有深入研究它。
Names.Add方法 (Excel)Application.Evaluate方法 (Excel)