VBA隐藏工作簿中未使用的所有工作表

时间:2017-07-25 14:25:00

标签: excel vba excel-vba

我在工作簿中有很多工作表。我有一个名为“JE”的主表单/“表单”,在该表单上有一些按钮和宏指向工作簿中的其他表单。但是,其目的是让其他用户而不是我自己使用工作簿。所以,我只想在任何给定时间看到正在使用的工作表。在任何时候我都不希望用户看到超过1张纸。用户可以主要通过单击按钮和选择表单中的某些单元格来导航工作簿,这些单元格将允许它们在整个工作簿中导航。我已经通过在“ThisWorkbook”模块中添加代码尝试了这一点,但它似乎没有像我想的那样工作。当我导航到一张纸并返回另一张纸时,当我希望它们被隐藏时,一些纸张仍然可见,所以我不确定我可以对下面的代码进行哪些其他修改以获得我想要的结果。如果有人能提供任何修改或改变我可以做到这一点,我真的很感激。

更新: 我已将此代码添加到我的'ThisWorkbook'对象:

 Option Explicit

    Private Sub Workbook_SheetActivate(ByVal Sh As Object)
      Dim MySh As Worksheet

      For Each MySh In ThisWorkbook.Worksheets
          If MySh.Name <> Sh.Name Then MySh.Visible = 0 
      Next MySh
    End Sub

但是,当我双击通常填充主页(“JE”)中的单元格的值时,我得到运行时1004错误。这些值仍然填充主表,但它不再按照我的意愿导航回主表。

如果有人知道我能做出的解决方案或模式,我真的很感激。

3 个答案:

答案 0 :(得分:4)

代码很好。只需将其放入VBA项目的工作簿部分:

Option Explicit

Private Sub Workbook_Open()

    Dim MySh As Worksheet

    For Each MySh In ThisWorkbook.Worksheets
        If MySh.Name = ActiveSheet.Name Then MySh.Visible = xlSheetHidden
    Next MySh

End Sub

ThisWorkbook部分在这里: enter image description here

一般情况下,当我启动Excel应用程序时,我总是使用类似的东西。我使用ArraysVisible工作表定义了两个Invisible,然后迭代它们,使它们可见或不可见。像这样:

Option Explicit

Public Sub HideNeeded()

    Dim varSheet                    As Variant
    Dim arrVisibleSheets            As Variant
    Dim arrHiddenSheets             As Variant

    arrVisibleSheets = Array(Sheet1)
    arrHiddenSheets = Array(Sheet2, Sheet3)

    For Each varSheet In arrVisibleSheets
        varSheet.Visible = xlSheetVisible
    Next varSheet

    For Each varSheet In arrHiddenSheets
        varSheet.Visible = xlSheetVeryHidden
    Next varSheet

End Sub

xlSheetVeryHidden可以仅从VB编辑器取消隐藏它。否则你需要xlSheetHidden

答案 1 :(得分:1)

应为Workbook_SheetActivate

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
  Dim MySh As Worksheet

  For Each MySh In ThisWorkbook.Worksheets
      If MySh.Name <> Sh.Name Then MySh.Visible = 0 'zero - false, 1 - true, 2 - very hidden
  Next MySh
End Sub

答案 2 :(得分:0)

Sub HideInactive()

Set theActiveSheet = ActiveSheet

For Each Sheet In ThisWorkbook.Worksheets
    If Sheet.Index <> theActiveSheet.Index Then Sheet.Visible = False
Next

End Sub

我测试了代码。谢谢你的阅读。