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

Ans*_*Ans 1 excel vba excel-vba

所以我有一个Workbook_opensub Long在工作簿打开时创建变量:

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

  Dim i As Long
  i = 68 
End Sub
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*don 11

Dim i在一个过程范围内创建i一个局部变量; 它只能从它声明的程序中访问.

传递i给另一个程序的想法非常合理:它意味着你打算尽可能地保持变量范围,这是一件非常好的事情.

但在这种情况下,它是紧张,因为事件处理程序的参数由事件源提供:您需要在"促进"是局部变量了一个范围级别.

下一个最严格的范围级别是模块范围.

可以Dim在模块级别使用关键字,但为了保持一致性,我建议您使用关键字Private.所以在同一个模块中,声明你的模块级变量:

Option Explicit
Private i As Long

Private Sub Workbook_open()
  MsgBox "Workbook opened"
  i = 68 
End Sub
Run Code Online (Sandbox Code Playgroud)

如果要在该模块之外公开该变量的值,可以为其公开一个访问器:

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
Run Code Online (Sandbox Code Playgroud)

现在Sheet1模块的Worksheet_Change处理程序可以读取它:

Private Sub Worksheet_Change(ByVal Target As Range)
    MsgBox ThisWorkbook.MyValue
End sub
Run Code Online (Sandbox Code Playgroud)

但它不能写入它,因为该属性是"只获得".如果每个地方的每个人都需要能够读/写它,那么你也可以将它作为一个全局变量,或者为它公开一个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
Run Code Online (Sandbox Code Playgroud)