VBA中具有值的全局variables

我正在一个Excel文件与几个潜艇,这是相互独立的。 但是他们仍然始终使用相同的variables。 因此,我想在全球范围内定义这个variables,但是我很容易find的只是在全局范围内进行声明。 我该怎么做,我也可以从一开始就直接填充variables值? 是否有可能从一开始就定义variables,而不必写一个子类,如下面的例子? (我相信这是不可能的,或者我错了吗?)

我将不胜感激您的帮助!

托马斯

Public s1, s2, s3 As Worksheet Public array1, array2 As Variant s1 = ThisWorkbook.Worksheets("Sheet 1") s2 = ThisWorkbook.Worksheets("Sheet 2") s3 = ThisWorkbook.Worksheets("Sheet 3") array1 = Array(3, 5, 6, 7, 5) array2 = Array(8, 9, 10, 11, 12) Sub code1() ... End Sub Sub code2() ... End Sub 

您可以在模块中将它们定义为公共variables,然后将它们设置在ThisWorkBook模块的Workbook_Open中(其中工作表在MS Visual Basic编辑器中列出):

 Public Sub Workbook_Open() Set s1 = ThisWorkbook.Worksheets("Sheet 1") Set s2 = ThisWorkbook.Worksheets("Sheet 2") Set s3 = ThisWorkbook.Worksheets("Sheet 3") array1 = Array(3, 5, 6, 7, 5) array2 = Array(8, 9, 10, 11, 12) End Sub 

每当电子表格第一次打开时,都会执行此方法。

是否有可能从一开始就定义variables,而不必写一个子?

不,您只能在子过程或函数中获取/设置variables的值。


在附注中,您现在的代码是:

 Public s1, s2, s3 As Worksheet Public array1, array2 As Variant 

s1s2声明为Variants3作为Worksheet – 在VBA中,您可以用这种方式声明多个相同types的variables,这是一个常见的误解。

在VBA的一行上做到这一点的正确方法是:

 Public s1 As Worksheet, s2 As Worksheet, s3 As Worksheet 

我会说在第二行相同,但你已经声明,作为一个变种无论如何。

你应该把他们填入Workbook_Open事件。 转到ThisWorkbook模块并写入:

 Private Sub Workbook_Open() [fill variables here] End Sub 

当您打开WorkBook时会调用此事件。

如果你想使用这些值,如constantsconstants具有相同的值,那么你仍然可以将它们定义为ThisWorkbook类的private成员,并实现get属性,该值返回值并确保定义该值。

这个解决scheme的优点是除了ThisWorkbook对象之外没有人可以改变这个variables的值。 公共全局variables不是这种情况,因为有人可能会意外地将例如workbook1设置为Nothing并且因为Workbook_Open只在最初运行一次,所以在访问workbook1时将发生错误。 IMO使用globalvariables大多不是好主意。 HTH

ThisWorkbook类模块:

 Option Explicit Private m_worksheet1 As Worksheet Private m_array1 As Variant Public Property Get Worksheet1() As Worksheet If m_worksheet1 Is Nothing Then _ Set m_worksheet1 = ThisWorkbook.Worksheets("Sheet 1") Set Worksheet1 = m_worksheet1 End Property Public Property Get Array1() As Variant If Not IsArray(m_array1) Then _ m_array1 = Array(3, 5, 6, 7, 5) Array1 = m_array1 End Property 

然后在工作簿中的任何地方都可以像这样调用ThisWorkbook上的属性。

 Debug.Print UBound(ThisWorkbook.Array1) Debug.Print ThisWorkbook.Worksheet1.Name 

输出:

 4 Sheet 1