VBA скрывает и показывает листы на основе ДА/НЕТ и имени листа

#vba #loops #hide #show

Вопрос:

У меня есть рабочая тетрадь со множеством листов. У меня есть рабочий лист с индексом, в котором перечислены имена рабочих листов в столбце B и вопрос «Да/нет» в столбце c. Мне нужен код, который, когда я нажму «ДА», откроет рабочий лист, которому он соответствует. Когда я нажму «НЕТ», он скроет рабочий лист. Имена в списке точно соответствуют названиям рабочих листов. Я предполагаю, что это будет с петлей?

Диапазон от B27 до C61

Комментарии:

1. Где конкретно вы застряли? Возможно, исследуйте это Worksheet_Change событие.

2. Пытаюсь получить код для поиска имени в столбце B, когда в столбце C указано «ДА». Он должен найти скрытый лист с тем же именем и сделать его видимым

3. ThisWorkbook.Worksheets(Range("B27").Value).Visible = xlSheetVisible ?

4. Немного, но не должно ли это быть петлей?

5. Нет, если вы используете это Worksheet_Change событие.

Ответ №1:

Если мы предположим, что столбец 2 содержит название листа, а столбец 3 содержит либо Да, либо Нет, то этот код сделает это с помощью двойного щелчка:

 Option Explicit

Private Function GetSheet(SheetName As String) As Worksheet
    On Error Resume Next
    Set GetSheet = ThisWorkbook.Sheets(SheetName)
    If Err.Number <> 0 Then
        Err.Clear
    End If
End Function

Private Sub ShowHideClick(Rng As Range, ActivateSheet As Boolean)
    Dim RowNum As Long, ColNum As Long
    Dim YesNo As String
    Dim SheetName As String
    Dim Sht As Worksheet
    
    RowNum = Rng.Row
    ColNum = Rng.Column
    If Not (RowNum >= 27 And RowNum <= 61 And ColNum = 3) Then Exit Sub
    YesNo = Rng
    If YesNo <> "Yes" And YesNo <> "No" Then Exit Sub
    SheetName = Rng.Offset(0, -1)
    Set Sht = GetSheet(SheetName)
    If Sht Is Nothing Then Exit Sub
    If YesNo = "Yes" Then
        If Sht.Visible = xlSheetVeryHidden Then
            Sht.Visible = xlSheetHidden
        End If
        Sht.Visible = xlSheetVisible
        If ActivateSheet Then
            Sht.Activate
        End If
        Rng.Value = "No"
    Else
        If Sht.Visible = xlSheetVisible Then
            Sht.Visible = xlSheetHidden
        End If
        Rng.Value = "Yes"
    End If
End Sub

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Cancel = True
    ShowHideClick Target, True
End Sub

 

Вставьте код в таблицу woorksheet, содержащую таблицу «Да/нет».

Комментарии:

1. Привет, спасибо за ответ:)! Не могли бы мы сделать так, чтобы он не щелкал дважды, а, скорее, когда я использую раскрывающийся список и выбираю «Да», он автоматически откроется? Кроме того, когда он откроется, можем ли мы гарантировать, что экран не перейдет на новый лист, я хочу, чтобы он оставался на листе 1

2. @Адель, добро пожаловать. Ответ-это ответ на поставленный вами вопрос. Он активирует лист, который он показывает. Измените логическое значение при вызове ShowHideClick с True на False , чтобы не активировать лист. Причина, по которой мы используем двойной щелчок, заключается в том, что все другие методы захвата одного щелчка левой кнопкой мыши трудно поддерживать или создавать эффекты, которые воспринимаются пользователем как ошибки. Если у вас есть еще один вопрос, вам следует создать новый вопрос. Когда вы задаете вопросы о stackoverflow, не забудьте включить некоторый код, который показывает, что вы пытались сделать до сих пор.