在Workbook_open上创建并分配变量,然后将其传递给Worksheet_change

时间:2018-08-17 15:48:53

标签: excel vba excel-vba

因此,我有一个Workbook_open子项,该子项在打开工作簿时创建Long变量:

Private Sub Workbook_open()
  MsgBox ("Workbook opened")

  Dim i As Long
  i = 68 
End Sub

如何将i值传递给特定工作表的Worksheet_change子项?

2 个答案:

答案 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