Vba 在工作簿上创建并分配变量\u打开,将其传递给工作表\u更改
所以我有一个Vba 在工作簿上创建并分配变量\u打开,将其传递给工作表\u更改,vba,excel,Vba,Excel,所以我有一个Workbook\u opensub,它在打开工作簿时创建Long变量: Private Sub Workbook_open() MsgBox ("Workbook opened") Dim i As Long i = 68 End Sub 如何将I值传递给特定工作表的工作表\u changesub,将i声明为标准模块上的公共变量,如Module1,然后您可以在工作表更改事件中访问i的值,如果它在工作簿打开事件期间被初始化 标准模块上的: Public i As L
Workbook\u open
sub,它在打开工作簿时创建Long
变量:
Private Sub Workbook_open()
MsgBox ("Workbook opened")
Dim i As Long
i = 68
End Sub
如何将
I
值传递给特定工作表的工作表\u change
sub,将i
声明为标准模块
上的公共变量
,如Module1
,然后您可以在工作表更改事件
中访问i
的值,如果它在工作簿打开事件
期间被初始化
标准模块上的:
Public i As Long
Private Sub Workbook_open()
MsgBox ("Workbook opened")
i = 68
End Sub
在此工作簿模块上:
Public i As Long
Private Sub Workbook_open()
MsgBox ("Workbook opened")
i = 68
End Sub
为此,将
i
声明为标准模块
上的公共变量
,如Module1
,然后您可以访问工作表更改事件
中的i
值,如果它在工作簿打开事件
期间被初始化
标准模块上的:
Public i As Long
Private Sub Workbook_open()
MsgBox ("Workbook opened")
i = 68
End Sub
在此工作簿模块上:
Public i As Long
Private Sub Workbook_open()
MsgBox ("Workbook opened")
i = 68
End Sub
过程范围内的
Dim i
使i
成为局部变量;它只能从声明它的过程中访问
将i
传递给另一个过程的想法非常合理:这意味着您希望尽可能地保持变量作用域的紧凑性,这是一件非常好的事情
但在这种情况下,它太紧了,因为事件处理程序的参数是由事件源提供的:您需要将该局部变量“提升”到一个作用域级别
其次是模块范围
您可以在模块级别使用Dim
关键字,但为了一致性起见,我建议使用关键字Private
。因此,在同一模块中声明模块级别变量:
Option Explicit
Private i As Long
Private Sub Workbook_open()
MsgBox "Workbook opened"
i = 68
End Sub
如果要在此模块之外公开该变量的值,可以公开该变量的访问器:
现在,Sheet1
模块的工作表\u Change
处理程序可以读取它:
Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox ThisWorkbook.MyValue
End sub
但是它不能写入它,因为属性是“get only”。如果任何地方的每个人都需要能够读/写它,那么您最好将其设置为一个,或者为其公开一个变体:
过程范围内的
Dim i
使i
成为局部变量;它只能从声明它的过程中访问
将i
传递给另一个过程的想法非常合理:这意味着您希望尽可能地保持变量作用域的紧凑性,这是一件非常好的事情
但在这种情况下,它太紧了,因为事件处理程序的参数是由事件源提供的:您需要将该局部变量“提升”到一个作用域级别
其次是模块范围
您可以在模块级别使用Dim
关键字,但为了一致性起见,我建议使用关键字Private
。因此,在同一模块中声明模块级别变量:
Option Explicit
Private i As Long
Private Sub Workbook_open()
MsgBox "Workbook opened"
i = 68
End Sub
如果要在此模块之外公开该变量的值,可以公开该变量的访问器:
现在,Sheet1
模块的工作表\u Change
处理程序可以读取它:
Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox ThisWorkbook.MyValue
End sub
但是它不能写入它,因为属性是“get only”。如果任何地方的每个人都需要能够读/写它,那么您最好将其设置为一个,或者为其公开一个变体:
如果它只是一个静态值,为什么不在
工作表\u change
中声明它呢?对不起,我投票在“不清楚你在问什么”下关闭了答案。到目前为止,还需要更多的细节来说明你到底想要实现什么。注意:@Marcucciboy2在这里提出了一个非常有效的观点,但很难回答,如果我们不知道你到底想做什么,你可能会发现这篇文章很有用。如果它只是一个静态值,为什么不在工作表\u change
中声明它呢?对不起,但我投票在“不清楚你在问什么”下关闭了答案。到目前为止,还需要更多的细节来说明你到底想要实现什么。注意:@Marcucciboy2在这里提出了一个非常有效的观点,但很难回答,如果我们不知道你到底想做什么,你可能会发现这篇文章很有用。我不知道“变种人”。。好发现。很好exposition@DisplayName它们的另一个名称是“setter”(在其他语言中使用),但术语“setter”在VBA中并不合适,因为属性集
和属性Let
都存在(其中属性集
是封装对象引用的变体),“字母”并不能完全消除它;-)除了名字之外,我不知道是否有可能给/让ThisWorkbook
成员设置/让/获取。我猜上面的代码将驻留在这个工作簿代码窗格中,不是吗?是的。也就是说,任何模块类型都可以具有属性,包括标准模块ThisWorkbook
只是一种特殊的类模块-它是一个文档模块,继承了Workbook
类的所有成员,并具有VB\u predeclaredd
属性(类似于UserForm
模块)这使其默认实例可以全局访问-因此,根据您是引用类型还是对象,ThisWorkbook
分别是模块本身还是该类的默认实例。不知道“mutators”。。好发现。很好exposition@DisplayName它们的另一个名称是“setter”(在其他语言中使用),但术语“setter”在VBA中并不合适,因为属性集
和属性Let
都存在(其中属性集
是封装对象引用的变体),“字母”并不能完全消除它;-)除了名字,我不知道有什么可能