【问题标题】:Automatically hiding/unhiding 'sub' worksheets when 'master' worksheet is selected选择“主”工作表时自动隐藏/取消隐藏“子”工作表
【发布时间】:2019-07-19 10:16:22
【问题描述】:

问题

我正在运行一个宏,它会根据用户输入创建几个新的工作表;至少一个“主”工作表和几个“子”工作表。这些将具有“Group 1 Master”、“Group 1 Sub 1”、“Group 2 Sub 2”、“Group 2 Sub 3”......“Group n Master”、“Group n 子 1"......

我想找到一种方法来隐藏子工作表,直到它们的主工作表被选中/激活,此时它们应该变得可见,然后当没有选择主工作表时,它们应该再次隐藏。

接近

我发现sources 指示如何手动实现这一点,方法是在给定的工作表中插入下面的 sub 类似的东西,但是我的工作表是由宏生成的,我不想手动完成和将此添加到所有这些。

Private Sub Worksheet_Activate()
    For Each SubSheet in SubSheets
        SubSheet.Visible = False
    Next SubSheet
End Sub

问题

除了选择它们的主工作表之外,我如何隐藏所有子工作表?

谢谢

【问题讨论】:

  • 顺序会一直是Master 1,然后是所有子节点到主节点 1,然后是 Master 2,然后是所有子节点到主节点 2?这将更容易检测到潜艇。
  • @Pᴇʜ 是的,子选项卡将始终是紧随其主选项卡之后的下一个主选项卡。谢谢

标签: excel vba worksheet


【解决方案1】:

想象一下所有工作表都可见时的样子:

这就是隐藏所有子工作表的样子:

这是自动隐藏/显示活动主工作表的子工作表的方式:

我使用了以下代码:

Option Explicit

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    'find master left of selected sheet
    Dim ActiveMaster As Object
    Dim iSht As Long
    For iSht = Sh.Index To 1 Step -1    'loop backwards until a master is found
        If InStr(1, ThisWorkbook.Sheets(iSht).Name, "Master") > 0 Then
            Set ActiveMaster = ThisWorkbook.Sheets(iSht)
            Exit For
        End If
    Next iSht

    If ActiveMaster Is Nothing Then
        'no master sheet left of current sheet found
        MsgBox "No 'Master' sheet found.", vbCritical
        Exit Sub
    End If

    'find last sub sheet
    Dim LastSub As Object
    For iSht = ActiveMaster.Index + 1 To ThisWorkbook.Sheets.Count
        If InStr(1, ThisWorkbook.Sheets(iSht).Name, "Master") > 0 Then
            Set LastSub = ThisWorkbook.Sheets(iSht - 1)
            Exit For
        End If
    Next iSht

    'if no last sub sheet was found it is the very last sheet
    If LastSub Is Nothing Then
        Set LastSub = ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count)
    End If

    'hide all SUB-sheets left of master sheet and right of LastSub sheet
    If ActiveMaster.Index > 1 Then
        For iSht = 1 To ThisWorkbook.Sheets.Count
            If iSht < ActiveMaster.Index Or iSht > LastSub.Index Then
                If InStr(1, ThisWorkbook.Sheets(iSht).Name, "Master") = 0 Then
                    ThisWorkbook.Sheets(iSht).Visible = xlSheetHidden
                End If
            Else
                ThisWorkbook.Sheets(iSht).Visible = xlSheetVisible
            End If
        Next iSht
    End If
End Sub


Public Sub ShowAllSheets()
    Dim iSht As Long
    For iSht = 1 To ThisWorkbook.Sheets.Count
        ThisWorkbook.Sheets(iSht).Visible = xlSheetVisible
    Next iSht
End Sub


Public Sub HideAllSubSheets()
    Dim iSht As Long
    For iSht = 1 To ThisWorkbook.Sheets.Count
        If InStr(1, ThisWorkbook.Sheets(iSht).Name, "Master") = 0 Then
            ThisWorkbook.Sheets(iSht).Visible = xlSheetHidden
        End If
    Next iSht
End Sub

【讨论】:

  • 感谢您提供更新的答案,这完全实现了我想要的 :)
猜你喜欢
  • 1970-01-01
  • 2017-07-05
  • 2023-03-27
  • 2011-02-25
  • 2014-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-14
相关资源
最近更新 更多