工作簿打开事件并在工作表代码中检测到此事件
我正试图减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
而这些在ThisWorbook
和Sheet
模块中 :
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声明! 卫生署!