我正在处理一个包含多个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
答案 0 :(得分:5)
是否有可能从头开始定义变量而不必编写子?
不,您只能在子过程或函数中获取/设置变量的值。
旁注,您当前的代码:
Public s1, s2, s3 As Worksheet
Public array1, array2 As Variant
将s1
和s2
声明为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