首页 > 解决方案 > 根据多个单元格值隐藏或取消隐藏工作表

问题描述

对于工作,我试图弄清楚当您在列中键入特定单词时如何在 excel 中制作宏以取消隐藏工作表。
我对此完全陌生,所以这是一个很大的搜索。

到目前为止,我得到了这个:

Private Sub Worksheet_Change(ByVal Target As Range)
    If [C2] = "POMP" Then
        Sheets("POMP").Visible = True
    Else
        Sheets("POMP").Visible = False
    End If

    If [C2] = "TANK" Then
        Sheets("TANK").Visible = True
    Else
        Sheets("TANK").Visible = False
    End If

    If [C2] = "VENTILATOR" Then
        Sheets("VENTILATOR").Visible = True
    Else
        Sheets("VENTILATOR").Visible = False
    End If

    If [C2] = "MOTOR" Then
        Sheets("MOTOR").Visible = True
    Else
        Sheets("MOTOR").Visible = False
    End If
End Sub

这只是一个更大项目的示例。到目前为止它有效。当我在 C2 中键入 MOTOR 时,MOTOR 选项卡将取消隐藏。也为其他人。但..

它实际上必须适用于整个 C 列,而不仅仅是 C2。

有人可以帮我解决这个问题吗?

还有另一个问题。如果在输入单词时必须取消隐藏 2 张纸,我该如何将其放入代码中。示例:我键入 MOTOR,然后应该取消隐藏 MOTOR 和 POMP 表。

如果你能帮我解决这个问题,那将是一个很大的帮助!

标签: excelvba

解决方案


只需将您的工作表名称列表作为数组。遍历该数组并使用WorksheetFunction.Match 方法检查工作表名称是否存在于 C 列中以隐藏或显示工作表。

请注意,Application.Match如果在 C 列中找不到工作表名称,则会返回错误,因此我们使用它来触发隐藏/显示。

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim SheetNames() As Variant
    SheetNames = Array("POMP", "TANK", "VENTILATOR", "MOTOR") 'list your sheet names here

    Dim SheetName As Variant
    For Each SheetName In SheetNames
        Dim MatchedRow As Variant
        MatchedRow = Application.Match(SheetName, Me.Columns("C"), 0)

        On Error Resume Next 'catch error if sheet name does not exist
        ThisWorkbook.Worksheets(SheetName).Visible = Not IsError(MatchedRow)
        If Err.Number <> 0 Then MsgBox "Worksheet '" & SheetName & "' not found!", vbCritical
        On Error GoTo 0
    Next SheetName
End Sub

推荐阅读