Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 在工作簿上创建并分配变量\u打开,将其传递给工作表\u更改_Vba_Excel - Fatal编程技术网

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
都存在(其中
属性集
是封装对象引用的变体),“字母”并不能完全消除它;-)除了名字,我不知道有什么可能