Userform可见性

时间:2018-04-13 16:23:20

标签: excel excel-vba userform vba

我的用户窗体打开了其他工作簿,但仍然在其上。这可以停止吗?在打开的工作簿之间单击时也会发生这种情况 当激活不同的工作表而不是不同的工作簿时,下面的代码适用于我。

    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

1 个答案:

答案 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的状态;但是,我可能是错的。