How do I declare a global variable in VBA?
我写了以下代码:
1 2 3 4 5 6 | Function find_results_idle() Public iRaw As Integer Public iColumn As Integer iRaw = 1 iColumn = 1 |
我收到错误消息:
"invalid attribute in Sub or Function"
你知道我做错了吗?
我尝试使用
我试图将函数本身声明为" Public",但这也没有好处。
创建全局变量需要做什么?
您需要在函数外部声明变量:
1 2 3 4 5 6 | Public iRaw As Integer Public iColumn As Integer Function find_results_idle() iRaw = 1 iColumn = 1 |
这是关于范围的问题。
如果只希望变量在函数的生存期内有效,请在函数或子函数内使用
1 2 3 4 5 6 7 8 | Function AddSomeNumbers() As Integer Dim intA As Integer Dim intB As Integer intA = 2 intB = 3 AddSomeNumbers = intA + intB End Function 'intA and intB are no longer available since the function ended |
使用
1 2 3 4 5 6 7 8 9 10 11 | Public intA As Integer Private intB As Integer Function AddSomeNumbers() As Integer intA = 2 intB = 3 AddSomeNumbers = intA + intB End Function 'intA and intB are still both available. However, because intA is public, ' 'it can also be referenced from code in other modules. Because intB is private,' 'it will be hidden from other modules. |
通过使用
如果您要构建一个大型应用程序并且需要使用全局变量,则建议您为全局变量创建一个单独的模块。这应该有助于您将它们放在一个地方。
若要使用全局变量,请从VBA Project UI插入新模块,然后使用
1 2 | Global iRaw As Integer Global iColumn As Integer |
正如另一个人所说的,问题实际上是关于范围的。
简而言之,请考虑以下"模块":
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | Public Var1 As variant 'Var1 can be used in all 'modules, class modules and userforms of 'thisworkbook and will preserve any values 'assigned to it until either the workbook 'is closed or the project is reset. Dim Var2 As Variant 'Var2 and Var3 can be used anywhere on the Private Var3 As Variant ''current module and will preserve any values ''they're assigned until either the workbook ''is closed or the project is reset. Sub MySub() 'Var4 can only be used within the procedure MySub Dim Var4 as Variant ''and will only store values until the procedure End Sub ''ends. Sub MyOtherSub() 'You can even declare another Var4 within a Dim Var4 as Variant ''different procedure without generating an End Sub ''error (only possible confusion). |
您可以查看该MSDN参考,以获取有关变量声明的更多信息,以及有关另一个堆栈溢出问题,以获取有关变量如何超出范围的更多信息。
另外两件事:
如果此函数在模块/类中,则可以在函数外部编写它们,因此它具有
1 2 3 4 5 6 7 8 9 10 11 12 | Dim iRaw As Integer Dim iColumn As Integer Function find_results_idle() iRaw = 1 iColumn = 1 End Function Function this_can_access_global() iRaw = 2 iColumn = 2 End Function |
在一般声明中创建一个公共整数。
然后,您可以在函数中每次增加其值。
请参见示例(将电子邮件附件另存为CSV的功能)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Public Numerator As Integer Public Sub saveAttachtoDisk(itm As Outlook.MailItem) Dim objAtt As Outlook.Attachment Dim saveFolder As String Dim FileName As String saveFolder ="c:\temp" For Each objAtt In itm.Attachments FileName = objAtt.DisplayName &"_" & Numerator &"_" & Format(Now,"yyyy-mm-dd H-mm-ss") &".CSV" objAtt.SaveAsFile saveFolder &"" & FileName Numerator = Numerator + 1 Set objAtt = Nothing Next End Sub |
您也可以使用-
1 2 3 4 5 6 7 8 9 | Private Const SrlNumber As Integer = 910 Private Sub Workbook_Open() If SrlNumber > 900 Then MsgBox"This serial number is valid" Else MsgBox"This serial number is not valid" End If End Sub |
在Office 2010上经过测试
创建Public / Global变量的一个好方法是将Form视为类对象,并声明属性,然后使用Public Property Get [variable]访问属性/方法。另外,您可能需要引用或将引用传递给实例化的Form模块。如果您对关闭的表单/报表调用方法,则会收到错误消息。
示例:将Me.Form.Module.Parent传递到sub / function而不是表单内部。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | Option Compare Database Option Explicit ''***********************************'' ' Name: Date: Created Date Author: Name ' Current Version: 1.0 ' Called by: ''***********************************'' ' Notes: Explain Who what when why... ' This code Example requires properties to be filled in ''***********************************'' ' Global Variables Public GlobalData As Variant ''***********************************'' ' Private Variables Private ObjectReference As Object Private ExampleVariable As Variant Private ExampleData As Variant ''***********************************'' ' Public properties Public Property Get ObjectVariable() As Object Set ObjectVariable = ObjectReference End Property Public Property Get Variable1() As Variant 'Recommend using variants to avoid data errors Variable1 = ExampleVariable End property ''***********************************'' ' Public Functions that return values Public Function DataReturn (Input As Variant) As Variant DataReturn = ExampleData + Input End Function ''***********************************'' ' Public Sub Routines Public Sub GlobalMethod() 'call local Functions/Subs outside of form Me.Form.Refresh End Sub ''***********************************'' ' Private Functions/Subs used not visible outside ''***********************************'' End Code |
因此,在另一个模块中,您将可以访问:
1 2 3 4 5 6 7 8 9 10 11 12 | Public Sub Method1(objForm as Object) 'read/write data value objForm.GlobalData 'Get object reference (need to add Public Property Set to change reference object) objForm.ObjectVariable 'read only (needs Public property Let to change value) objForm.Variable1 'Gets result of function with input objForm.DataReturn([Input]) 'runs sub/function from outside of normal scope objForm.GlobalMethod End Sub |
如果您像我一样使用Late Binding,那么在尝试进行任何处理之前,请务必检查Null值和Nothing对象。