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
将s1
和s2
声明为Variant
和s3
作为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时会调用此事件。
如果你想使用这些值,如constants
将constants
具有相同的值,那么你仍然可以将它们定义为ThisWorkbook
类的private
成员,并实现get
属性,该值返回值并确保定义该值。
这个解决scheme的优点是除了ThisWorkbook
对象之外没有人可以改变这个variables的值。 公共全局variables不是这种情况,因为有人可能会意外地将例如workbook1
设置为Nothing
并且因为Workbook_Open
只在最初运行一次,所以在访问workbook1
时将发生错误。 IMO使用global
variables大多不是好主意。 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