我如何在VBA中声明一个全局variables?

我写了下面的代码:

Function find_results_idle() Public iRaw As Integer Public iColumn As Integer iRaw = 1 iColumn = 1 

我收到错误消息:

“Sub或Function”中的无效属性

你知道我做错了吗?

我试图使用Global而不是Public ,但也得到了同样的问题。

我试图把这个函数本身声明为“Public”,但这也没有什么好处。

我需要做什么来创build全局variables?

您需要在函数之外声明variables:

 Public iRaw As Integer Public iColumn As Integer Function find_results_idle() iRaw = 1 iColumn = 1 

这是一个关于范围的问题。

如果您只想让variables持续使用函数的生命周期,请在函数或子函数内使用Dim维度为short)来声明variables:

 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 

全局variables(如SLaks指出的)在使用Public关键字的函数之外声明。 这个variables在运行应用程序的整个生命周期中都是可用的。 在Excel的情况下,这意味着只要特定的Excel工作簿打开,variables就可以使用。

 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. 

您也可以通过使用Private关键字声明variables,使其只能在特定的模块(或类)中访问。

如果你正在构build一个大的应用程序,并且觉得需要使用全局variables,那么我build议为你的全局variables创build一个单独的模块。 这应该可以帮助你在一个地方跟踪他们。

要使用全局variables,从VBA Project UI中插入新模块并使用Global声明variables

 Global iRaw As Integer Global iColumn As Integer 

如果这个函数是在一个模块/类中,你可以把它们写在函数之外,所以它具有Global Scope 。 全局范围意味着variables可以被同一个模块/类中的另一个函数访问(如果你使用dim作为声明语句,如果你希望variables可以被所有模块中的所有函数访问,则使用public ):

 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 

问题的关键在于范围,正如另一个人所说的那样。

总之,考虑这个“模块”:

 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参考更多关于variables声明和这个其他堆栈溢出问题更多关于variables如何超出范围。

另外两个快速的东西:

  1. 在使用工作簿级别variables时进行组织,所以您的代码不会混淆。 首选函数 (具有适当的数据types)或传递参数ByRef
  2. 如果您希望variables在调用之间保留其值,则可以使用Static语句。

在通用声明中创build一个公共整数。

然后在你的函数中,你可以每次增加它的值。 请参阅示例(将电子邮件的附件保存为CSV的function)。

 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