工作簿打开事件并在工作表代码中检测到此事件

我正试图减less一些.xlsm工作簿中的重复编码。 为此,我在“工作簿打开”区域创build了许多子表单,这些表单现在在表单1中从子表单中调用。(最初在这两个表单中都有重复的代码段)。 这一切工作正常!

我的问题是这个…

Sheet 1中的代码是否可能知道它正在被Workbook Open事件激活?

例如,我有一个combobox由Workbook_open事件填充,然后触发Sheet 1combobox“更改”事件。 但是,我只希望这个更改事件由用户在工作簿打开后触发。

我已经尝试在工作簿打开中设置一个全局variables,但是这只在这个事件中有作用域。

这里最好的解决方法是什么?

我可以使用工作簿模块吗?
我应该将variables写入工作表中的单元格,并在事件结束时将其清除?
其他的解决scheme?

部分工作簿打开代码

Private Ws_Open As Boolean Private Sub Workbook_Open() ' ' set up drop down filter list ' Range("A1").Select With ThisWorkbook.Worksheets(1).Cmb_filter .Clear .AddItem "None" .AddItem "60% or less" .AddItem "70% or less" .AddItem "80% or less" .AddItem "90% or less" .ListIndex = 0 End With 

部分表1的代码…

 Private Sub Cmb_filter_Change() Dim intvalue As Integer Cmb_filter.BackColor = vbWhite Application.Run "'" & ThisWorkbook.Name & "'!Thisworkbook.clear_it" ..etc 

如何使用Public / Globalvariables来防止事件触发

把它放在一个普通的模块中 ,其余的代码如下:

 Private Ws_Open As Boolean Private Sub Cmb_filter_Change_Proc() If Ws_Open Then Exit Sub Dim intvalue As Integer Cmb_filter.BackColor = vbWhite Application.Run "'" & ThisWorkbook.Name & "'!Thisworkbook.clear_it" '..etc End Sub Public Sub Wb_Open_Proc() ' ' set up drop down filter list ' Ws_Open = True Range("A1").Select With ThisWorkbook.Worksheets(1).Cmb_filter .Clear .AddItem "None" .AddItem "60% or less" .AddItem "70% or less" .AddItem "80% or less" .AddItem "90% or less" .ListIndex = 0 End With 'rest of your code Ws_Open = False End Sub 

而这些在ThisWorbookSheet模块中

 Private Sub Workbook_Open() Call Wb_Open_Proc End Sub Private Sub Cmb_filter_Change() Call Cmb_filter_Change_Proc End Sub 


不适用于此特定情况的命题 (工作表中的控件),但对于大多数其他Sheet,Workbook …


比检测事件如何被触发更简单,您可以使用Application.EnableEvents = False在代码中操作期间禁用事件

所以你的代码如下所示:

 Private Ws_Open As Boolean Private Sub Workbook_Open() ' ' set up drop down filter list ' Application.EnableEvents = False Range("A1").Select With ThisWorkbook.Worksheets(1).Cmb_filter .Clear .AddItem "None" .AddItem "60% or less" .AddItem "70% or less" .AddItem "80% or less" .AddItem "90% or less" .ListIndex = 0 End With Application.EnableEvents = True 

你需要一个公共variables。 例如:ThisWorkbook模块:

 Public Ws_Open As Boolean Private Sub Workbook_Open() ' ' set up drop down filter list ' Range("A1").Select ws_open = True With ThisWorkbook.Worksheets(1).Cmb_filter .List = Array("None", "60% or less", "70% or less", "80% or less", "90% or less") .ListIndex = 0 End With ws_Open = False End Sub 

然后在工作表中:

 Private Sub Cmb_filter_Change() Dim intvalue As Integer If ThisWorkbook.ws_Open then exit sub Cmb_filter.BackColor = vbWhite Application.Run "'" & ThisWorkbook.Name & "'!Thisworkbook.clear_it" 

好。 find了。 似乎我确实需要一个模块。 我无法得到上述解决scheme的工作。 工作簿中的公共声明工作正常,但工作表不能访问variables?

最后,我创build了Module1

 Public Ws_Open As Boolean 

这使得variables可以被所有的工作簿对象访问。

以前我曾试过模块解决scheme,但是有一个私有variables声明! 卫生署!