首页 > 解决方案 > 隐藏除选定之外的所有工作表 - Excel VBA

问题描述

第一次发帖,请原谅任何不良的礼仪。

我正在编写一个 VBA,它会生成一个信息包供我们的客户使用。这个包是根据某些用户选择动态构建的——例如常见问题页面将特定于用户所做的选择。我已经构建了每个模块,以便在内容表运行时将相关表名称添加到内容表中。最后,我拿起这张表格列表,选择它们并生成一个 PDF。

我想要做的是隐藏所有其他工作表,而不是选择的工作表 - 我可以通过专门命名它们来做到这一点,或者在纯参考工作表的工作表名称末尾添加“zzz”,但我希望有更好的方法。

我想要的代码会这样做:

  1. 选择所有已添加到内容页面的工作表并创建一个数组(这已经有效)
  2. 为选定的工作表生成 PDF(这也有效)
  3. 隐藏不在数组中的任何工作表(这是我正在努力解决的问题)

生成 PDF 的代码如下 - 请注意,由于一些计划不周的命名,“Contents Array”是内容表上的命名范围,“ContentsList”是 VBA 数组:

For Each cell In wsContents.Range("ContentsArray")
    ContentsList(j) = cell.Value
    wb1.Sheets(cell.Value).Select
    j = j + 1
Next 'cell

wb1.Sheets(ContentsList()).Select

FileName = wsControl.Range("CustomerName") & " Pack " & Format(wsControl.Range("ReportDate"), "dd-mm-yyyy")

PDFFilePath = wb1.Path & "/AutoGenerated Packs/" & FileName & ".pdf"

ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, FileName:=PDFFilePath, _
        Quality:=xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=True

标签: excelvba

解决方案


首先,您可以一次性将数组设置为范围:

ContentsList = wsContents.Range("ContentsArray").Value

然后,您将需要遍历工作簿中每个工作表的数组以检查它是否存在...类似于下面的内容(如果您对数组使用与已有的相同的方法,否则您将需要另一种方法来确定j(数组中的元素数)):

Dim ws As Worksheet
Dim i As Long

    For Each ws In Thisworkbook.Worksheets
        For i = 1 To j
             If ws.Name = ContentsList(i) Then
                 'if found exit for as we do not want to hide
                 Exit For
             End If
             'if not found then hide
             If i = j Then
                 ws.Visible = xlSheetHidden
             End If
        Next j
    Next ws

希望这可以帮助!


推荐阅读