是否可以在vba中声明公共变量并指定默认值?

是否可以在vba中声明公共变量并指定默认值?,vba,variables,default-value,public,variable-declaration,Vba,Variables,Default Value,Public,Variable Declaration,我想这样做,但它不会编译: Public MyVariable as Integer = 123 实现这一点的最佳方法是什么?当然你知道,但是如果它是一个常量,那么const MyVariable as Integer=123否则你就倒霉了;必须在其他地方为变量指定初始值 你可以: public property get myIntegerThing() as integer myIntegerThing= 123 end property 在类模块中,然后全局创建它 public

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

Public MyVariable as Integer = 123

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

当然你知道,但是如果它是一个常量,那么
const MyVariable as Integer=123
否则你就倒霉了;必须在其他地方为变量指定初始值

你可以:

public property get myIntegerThing() as integer
    myIntegerThing= 123
end property
在类模块中,然后全局创建它

public cMyStuff as new MyStuffClass

因此,
cMyStuff.myIntegerThing
立即可用。

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

或者,您可以自己创建一个具有相关属性的类,并使用initialise方法初始化它们。

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

只有常量才能在应用程序加载时指定值。你这样声明:

Public Const APOSTROPHE_KEYCODE = 222
以下是我的一个vba项目的示例声明:

如果您正在查找声明公共变量然后要初始化其值的内容,则需要创建工作簿\u Open sub并在那里进行初始化。 例如:

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
确保在工作簿对象本身中声明子对象:

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

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

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


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

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

Public MyVariable as Integer: MyVariable = 123

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

如上所述,要声明全局可访问变量,您可以在前面带有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.添加名为
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
鲜为人知的事实:
命名范围可以引用值而不是特定单元格。 这可以像“全局变量”一样使用,plus您可以在工作表单元格中引用VBA中的值,并且在关闭和重新打开工作簿后,分配的值甚至会保持不变


  • 要“声明”名称
    myVariable
    并将其赋值为
    123

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

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

  • 要使用工作表上的值只需在公式中按原样使用它的名称即可:

    =myVariable
    
  • 事实上,您甚至可以存储函数表达式(有点像中的)
    (诚然,我想不出这样做会有什么好处——但我也不在JS中使用它们。)


方括号只是该方法的快捷方式。我听说使用它们被认为是杂乱无章的,但我没有遇到任何问题,它们在Excel中的使用是由微软完成的

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


更多信息:
  • Microsoft Office开发中心:
  • Microsoft Office开发中心:

在哪里运行此VBA?Excel,Access,Word…@DuncanHowe我希望有一个通用的vba解决方案。全局变量不再被认为是邪恶的了吗?我在五月份离开了几周,所以我可能错过了一些东西。另请参见:它会产生编译错误:外部过程无效。提交人将添加一个模块并在此模块内定义这些属性。我创建了一个名为
Globals
的模块,并在这个模块中定义
Property Get
,它就像一个符咒。属性Get PSIStartRow()作为整数PSIStartRow=Sheets(“FOB价格”)。范围(“F1”)。值结束属性属性Get PSIStartCell()作为字符串PSIStartCell=“B”&PSIStartRow结束属性上述注释中的代码被损坏。我会把它贴在下面。
MsgBox Evaluate("myVariable")
=myVariable
ThisWorkbook.Names.Add "myDay", "=if(isodd(day(today())),""on day"",""off day"")"