我的用户窗体打开了其他工作簿,但仍然在其上。这可以停止吗?在打开的工作簿之间单击时也会发生这种情况 当激活不同的工作表而不是不同的工作簿时,下面的代码适用于我。
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
If Sh.Name <> "HTFD" And Flight_Deck.Visible = True Then
Unload Flight_Deck
End If
If Sh.Name = "HTFD" And Flight_Deck.Visible = False Then
Flight_Deck.Show vbModeless
End If
End Sub
答案 0 :(得分:1)
由于您使用Private Sub Workbook_SheetActivate(ByVal Sh As Object)
中的代码,我假设您知道如何将代码插入ThisWorkbook
模块。除了Workbook_SheetActivate
之外,还有工作簿激活和停用事件的子。
Private Sub Workbook_Activate()
If Sh.Name = "HTFD" Then
Flight_Deck.Show vbModeless
End If
End Sub
Private Sub Workbook_Deactivate()
Flight_Deck.Hide
End Sub
您还应该能够将代码插入到特定工作表的模块中。如果这样做,您可以在工作表模块中使用以下代码,您希望用户窗体显示该代码,并且由于代码仅在激活 特定工作表时激活,因此您不会必须检查工作表的名称。 (workbook_Activate
代码需要检查工作表的名称,因为每当工作簿被激活时都会运行,而不仅仅是针对特定工作表。
Private Sub Worksheet_Activate()
Flight_Deck.Show vbModeless
End Sub
Private Sub Worksheet_Deactivate()
Flight_Deck.Hide
End Sub
当然,通过此设置,只要有人打开,用户表单就会在该工作簿的工作表上显示始终。如果您只想在其他代码运行后初始化用户窗体,和/或您希望有时特别关闭用户窗体;你应该检查用户表格当前是否已加载。
此代码由gijsmo (2011年4月24日,14:08)在ozgrid.com上发布(回复#2)
Function IsUserFormLoaded(ByVal UFName As String) As Boolean
Dim UForm As Object
IsUserFormLoaded = False
For Each UForm In VBA.UserForms
If UForm.Name = UFName Then
IsUserFormLoaded = True
Exit For
End If
Next
End Function 'IsUserFormLoaded
<强>解释强>
使用Flight_Deck.Hide
/ Flight_Deck.Show
组合应保留有关用户表单的任何信息,以便下次显示该信息。 例外:如果代码在隐藏和显示之间暂停/停止,即为了调试,信息将丢失。
Private Sub Worksheet_Activate()
和Private Sub Worksheet_Deactivate()
,但活动工作簿不会更改。仅当活动工作簿更改时才会触发Private Sub Workbook_Activate()
和Private Sub Workbook_Deactivate()
。触发Private Sub Workbook_Activate()
或Private Sub Workbook_Deactivate()
后, Private Sub Worksheet_Activate()
或Private Sub Worksheet_Deactivate()
都不会被激活。
因此,由于您只希望userform显示在一个特定工作簿中的一个特定工作表上,因此您需要在两个位置都使用代码。
另外,根据这个逻辑,我不认为有必要检查Flight_Deck.Visible
的状态;但是,我可能是错的。