因此,我有一个Workbook_open
子项,该子项在打开工作簿时创建Long
变量:
Private Sub Workbook_open()
MsgBox ("Workbook opened")
Dim i As Long
i = 68
End Sub
如何将i
值传递给特定工作表的Worksheet_change
子项?
答案 0 :(得分:11)
Dim i
使i
成为 local 变量;只能从声明它的过程中访问它。
将i
传递到另一个过程的想法非常合理:这意味着您打算尽可能保持可变范围,这是非常非常好的事情。
但是在这种情况下,它太紧了,因为事件处理程序的参数由事件源提供:您需要将该局部变量“提升”到一个作用域级别。
下一个最严格的作用域级别是模块作用域。
您可以在模块级别使用Dim
关键字,但是出于一致性考虑,我建议改为使用关键字Private
。因此,在同一模块中,声明您的模块级变量:
Option Explicit
Private i As Long
Private Sub Workbook_open()
MsgBox "Workbook opened"
i = 68
End Sub
如果要在此模块之外公开该变量的值,可以为其公开访问器:
Option Explicit
Private i As Long
Private Sub Workbook_open()
MsgBox "Workbook opened"
i = 68
End Sub
Public Property Get MyValue() As Long
'invoked when MyValue is on the right-hand side expression of an assignment,
'e.g. foo = ThisWorkbook.MyValue
MyValue = i
End Property
现在Sheet1
模块的Worksheet_Change
处理程序可以读取它:
Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox ThisWorkbook.MyValue
End sub
但是它不能写入,因为该属性是“仅获取”。如果各地的每个人都需要能够对其进行读写,那么您也可以将其设置为global variable,或为其公开一个 mutator :
Option Explicit
Private i As Long
Private Sub Workbook_open()
MsgBox "Workbook opened"
i = 68
End Sub
Public Property Get MyValue() As Long
'invoked when MyValue is on the right-hand side expression of an assignment,
'e.g. foo = ThisWorkbook.MyValue
MyValue = i
End Property
Public Property Let MyValue(ByVal value As Long)
'invoked when MyValue is on the left-hand side of an assignment,
'e.g. ThisWorkbook.MyValue = 42; the 'value' parameter is the result of the RHS expression
i = value
End Property
答案 1 :(得分:2)
为此,在i
之类的Public Variable
上将Standard Module
声明为Module1
,然后可以在{{1}中访问i
的值},如果在Sheet Change Event
期间是initialized
。
在标准模块上:
Workbook Open Event
在此工作簿模块上:
Public i As Long