Vba 基于列表隐藏工作表

Vba 基于列表隐藏工作表,vba,excel,Vba,Excel,大家有一个简单的问题,我正在编写一个代码,根据工作表名称旁边的字段是“是”还是“否”隐藏工作表列表。因此,我有29个工作表的列表,我希望我的代码查看该名称旁边的字段,如果它是“是”,则在显示时隐藏它,如果它是“否”,则将隐藏它 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim ws As Worksheet For Each ws In Worksheets If ws.Name = Wor

大家有一个简单的问题,我正在编写一个代码,根据工作表名称旁边的字段是“是”还是“否”隐藏工作表列表。因此,我有29个工作表的列表,我希望我的代码查看该名称旁边的字段,如果它是“是”,则在显示时隐藏它,如果它是“否”,则将隐藏它

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim ws As Worksheet

    For Each ws In Worksheets
        If ws.Name = Worksheets("Settings").Range("B4:B32") _
        And Worksheets("Setting").Range("C4:C32") = "Yes" Then
            ws.Visible = True
        End If
        If ws.Name = Worksheets("Settings").Range("B4:B32") _
        And Worksheets("Setting").Range("C4:C32") = "No" Then
            ws.Visible = True
        End If
    Next ws
End Sub

我运行此程序并不断出现不匹配错误我是编程新手,因此我认为我调用的东西不正确

我相信以下代码应该适合您的需要:

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim wsSettings As Worksheet
    Dim wsHideShow As Worksheet
    Dim rngSheets As Range
    Dim xlCell As Range
    Dim sheetName As String

    Set wsSettings = ThisWorkbook.Worksheets("Settings")
    Set rngSheets = wsSettings.Range("B4:B32")

    For Each xlCell In rngSheets
        sheetName = xlCell.Value

        If sheetName <> "" Then

            Set wsHideShow = ThisWorkbook.Worksheets(sheetName)

            If xlCell.Offset(0, 1).Value = "yes" Then
                wsHideShow.Visible = False
            Else
                wsHideShow.Visible = True
            End If
        End If
    Next xlCell

End Sub

与其在工作表中循环,不如在列表中循环,并相应地隐藏/显示工作表。

打字速度慢。。。但是我的建议是:

Private Sub WorkSheet_Change(ByVal Target as range)

   If (Target.Row >= 4 And Target.Row <= 32 And Target.Column = 2) Then
      Dim i as Integer
      For i=0 To 28 Step 1
         If Range("B" & 2 + i).Value = "YES" Then
           ThisWorkBook.Worksheets(Range("A" & 2 + i).Value).Visible = True
         Else
           ThisWorkBook.Worksheets(Range("A" & 2 + i).Value).Visible = False
         End If
      Next i
   End If

End Sub
只有当图纸上B4:B32范围内的值发生变化时,才会触发此操作


希望这有助于…

此代码在标准模块中运行。它假定主设备是设置,而不是设置

它在桌子和床单上循环:

Sub DisplayOrHideSheets()
    Dim sh As Worksheet
    For Each ws In Sheets
        v = ws.Name
        For Each r In Worksheets("Settings").Range("B4:B32")
            If r.Value = v Then
                If r.Offset(0, 1) = "Yes" Then
                    ws.Visible = True
                Else
                    ws.Visible = False
                End If
            End If
        Next r
    Next ws
End Sub

每次从工作表上的一个单元格移动到同一工作表上的另一个单元格时,都会触发工作表\u SelectionChange事件宏。您不太可能需要或想要这种类型的开销。建议您使用仅在B4:C32有限范围内的更改值触发的工作表\u更改。顺便说一句,你的两个条件都可以分解成一个可见的工作表。很高兴它对你有效。请通过单击相应的复选标记图标接受我的答案。无论何时更改整个工作表上的任何单元格,都不会触发此触发器吗?如果控制显示/隐藏操作的唯一单元格位于B4:C32中,则该操作不应限制在这些单元格更改时进行?