我想这样做,但不会编译:
Public MyVariable as Integer = 123
实现这一目标的最佳方式是什么?
答案 0 :(得分:93)
.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:
答案 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
函数来引用这些名称的方法,但是我没有看到任何好处,因此我并没有对其进行深入研究。
Names.Add
method (Excel) Application.Evaluate
method (Excel) 答案 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
这有点难看,因为你必须重新输入变量名,但它在一行上。