带有值的VBA中的全局变量

时间:2017-03-17 20:18:31

标签: excel vba excel-vba

我正在处理一个包含多个sub的Excel文件,这些subs彼此独立。但是他们仍然始终使用相同值的相同变量。因此,我想在全局定义变量,但我发现很容易就是只在全局声明它们。我该怎么办呢?我还可以从头开始直接用变量填充变量?是否有可能从一开始就定义变量而不必编写子类,如下例所示? (我相信这不可能,或者我错了?)

感谢您的帮助!

托马斯

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

4 个答案:

答案 0 :(得分:5)

  

是否有可能从头开始定义变量而不必编写子?

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

旁注,您当前的代码:

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

s1s2声明为Variant并将s3声明为Worksheet - 在VBA中,您可以声明多个相同类型的变量,这是一个常见的误解就这样。

在VBA中的一行上执行此操作的正确方法是:

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

我会对第二行说同样的内容,但无论如何你已经宣布这是一个变种。

答案 1 :(得分:3)

您可以在模块中将它们定义为公共变量,然后在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

只要首次打开电子表格,就会执行此方法。

答案 2 :(得分:3)

你应该在Workbook_Open事件中填写它们。 转到ThisWorkbook模块并写下:

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

打开WorkBook时会调用此事件。

答案 3 :(得分:0)

如果您希望使用constants之类的值,它们始终具有相同的值,那么您仍然可以将它们定义为private类的ThisWorkbook成员并实现{{ 1}}属性,它返回值并确保定义值。

此解决方案的优点是除了get对象之外的任何人都无法更改此变量的值。公共全局变量不是这种情况,因为某人可能意外地例如将ThisWorkbook设置为workbook1,因为Nothing在一开始只运行一次,当访问Workbook_Open时会发生错误。 IMO使用workbook1变量大多不是好主意。 HTH

  

ThisWorkbook课程模块:

global

然后,工作簿中的所有位置都会在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