2011-05-05 195 views
38

我想这样做,但它不会编译:是否可以在vba中声明一个公共变量并指定默认值?

Public MyVariable as Integer = 123 

什么是实现这一目标的最佳途径?

+0

这个VBA在哪里运行? Excel,Access,Word ... – 2011-05-05 12:53:53

+0

@DuncanHowe我希望有一个通用的vba解决方案。 – David 2011-05-05 15:13:53

+3

全局变量不再被视为邪恶吗? 5月份我离开了几个星期,所以我可能错过了一些东西。 – 2011-07-04 07:46:23

回答

79

.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 

请务必申报工作簿中的子对象本身: enter image description here

+5

+1为您的答案的非常图形/教学精神! – CaBieberach 2011-05-06 08:25:07

-1

它已经有一段时间,但我相信这将是:

Public MyVariable as Integer 
MyVariable = 123 
+3

这恐怕不能编译。看起来太久了! – David 2011-05-05 15:17:44

+6

具体而言,'Public'声明必须是*例程之外('Sub'或'Function'),*内部的值赋值*。 – RolandTumble 2011-05-05 18:54:10

4

你当然知道,但如果它的常量,那么const MyVariable as Integer = 123否则你的运气了;该变量必须在别处分配一个初始值。

,你可以:

public property get myIntegerThing() as integer 
myIntegerThing= 123 
end property 
一类模块中

然后在全球创建它;

public cMyStuff as new MyStuffClass 

因此cMyStuff.myIntegerThing立即可用。

+0

最好是添加一个模块并在这个模块中定义这些属性。我创建了一个名为'Globals'的模块,并在这个模块中定义了'Property Get',它就像一个魅力一样。 属性Get PSIStartRow()作为整数 PSIStartRow =表( “FOB价格”)。范围( “F1”)。值 高端物业 属性获取PSIStartCell()作为字符串 PSIStartCell = “B” &PSIStartRow 高端物业 – Achilles 2016-07-11 12:01:22

+0

代码在上面的评论中受到了重创。我会把它放在下面。 – Achilles 2016-07-11 12:13:43

1

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

或者,你可以创建自己与相关属性的类,并在初始化方法

8

为了向您提供一个不同的角度 -

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

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

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

-1

它已经相当长一段时间,但是这可能会令你满意:

Public MyVariable as Integer: MyVariable = 123 

这是一个有点难看,因为你必须重新输入变量名,但它是在同一行。

+1

它产生编译错误:外部程序无效 – 2015-09-15 13:16:48

1

如上所述,要声明全局可访问变量,您可以在公用关键字之前的函数之外执行此操作。

而且,由于做作不是程序之外允许,你可以,例如,创建一个子叫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

这是我做什么,当我需要初始化的全局常量:
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 
相关问题