Скрыть / показать листы Excel на основе нескольких значений ячеек - PullRequest
0 голосов
/ 13 марта 2019

У меня есть книга Excel, которая содержит несколько листов.Я хочу скрыть / показать листы на основе значений ячеек в ячейках основного листа B3: B8.Значения на главном листе изменяются пользователем из предварительно определенного списка.

Например.Если в столбце «Конфигурация» существует «A», то в моей рабочей книге отобразите лист «A».

Workbook

На данный момент у меня есть следующий код, который работает, но выглядитнеуклюжий, Excel мерцает, поскольку код запускается каждый раз, когда значение изменяется в столбце «Конфигурация»:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim i As Integer
    Sheets("A").Visible = False
    Sheets("B").Visible = False
    Sheets("C").Visible = False
    Sheets("D").Visible = False

    For i = 3 To 8
        If InStr(1, Cells(i, 2), "A") Then
        Sheets("A").Visible = True
        ElseIf InStr(1, Cells(i, 2), "B") Then
        Sheets("B").Visible = True
        ElseIf InStr(1, Cells(i, 2), "C") Then
        Sheets("C").Visible = True
        ElseIf InStr(1, Cells(i, 2), "D") Then
        Sheets("D").Visible = True
        End If
    Next i

End Sub

Я также пытался запустить этот макрос из кнопки, но он останавливается с первым значением ИСТИНА (листстановится невидимым).

Ответы [ 3 ]

1 голос
/ 13 марта 2019

Я бы использовал этот метод:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim i As Integer
    Sheets("A").Visible = xlSheetHidden
    Sheets("B").Visible = xlSheetHidden
    Sheets("C").Visible = xlSheetHidden
    Sheets("D").Visible = xlSheetHidden

    Application.ScreenUpdating = False

    For i = 3 To 8
        If InStr(1, Cells(i, 2), "A") Then Sheets("A").Visible = xlSheetVisible
        If InStr(1, Cells(i, 2), "B") Then Sheets("B").Visible = xlSheetVisible
        If InStr(1, Cells(i, 2), "C") Then Sheets("C").Visible = xlSheetVisible
        If InStr(1, Cells(i, 2), "D") Then Sheets("D").Visible = xlSheetVisible
    Next i

    Application.ScreenUpdating = True
End Sub
1 голос
/ 13 марта 2019

Еще один способ сделать это:

Private Sub Worksheet_Change(ByVal Target As Range)

Dim RNG As Range, CL As Range
Dim WS As Worksheet

Application.ScreenUpdating = False

Set RNG = Sheets("Main").Range("B3:B8")
If Not Intersect(Target, RNG) Is Nothing Then
    Application.ScreenUpdating = False
    For Each WS In ThisWorkbook.Worksheets
        If WS.Name <> "Main" Then
            With RNG
            Set CL = .Find(What:=WS.Name, LookIn:=xlValues, LookAt:=xlWhole)
                If Not CL Is Nothing Then
                    WS.Visible = xlSheetVisible
                Else
                    WS.Visible = xlSheetHidden
                End If
            End With
        End If
    Next WS
End If

Application.ScreenUpdating = True

End Sub

Более универсальный и динамичный

РЕДАКТИРОВАТЬ: Чтобы также проверить, пересекается ли Target с вашим поискомдиапазон для предотвращения нежелательного запуска макроса.

0 голосов
/ 13 марта 2019

Чтобы помочь оптимизировать работу и улучшить внешний вид, используйте Application.ScreenUpdating. Это уменьшит мерцание, не пытаясь перекрасить экран до тех пор, пока саб не закончит работу. Если остальная часть программы работает без проблем, это должно быть все, что вам нужно

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim i As Integer
    Sheets("A").Visible = False
    Sheets("B").Visible = False
    Sheets("C").Visible = False
    Sheets("D").Visible = False

    For i = 3 To 8
        If InStr(1, Cells(i, 2), "A") Then
        Application.ScreenUpdating = False
        Sheets("A").Visible = True
        ElseIf InStr(1, Cells(i, 2), "B") Then
        Application.ScreenUpdating = False
        Sheets("B").Visible = True
        ElseIf InStr(1, Cells(i, 2), "C") Then
        Application.ScreenUpdating = False
        Sheets("C").Visible = True
        Application.ScreenUpdating = False
        ElseIf InStr(1, Cells(i, 2), "D") Then
        Sheets("D").Visible = True
        End If
    Next i
Application.sScreenUpdating = True
End Sub

Я также согласен с комментариями. Ifs было бы лучше. ElseIf предполагает, что только одно условие является правильным, когда может быть несколько итераций.

редактирование: Также, хотя: похоже на то, как он настроен, вы предполагаете, что любое значение между B3: B8, имеющее «A», покажет страницу «A». Если вы выделите его по-разному B3 = "A", B4 = "B" и т. Д. И т. Д., Вы можете изменить условные выражения на If Target.Address = "$B$3" Затем и включить B # вкл / выкл на листе "A" с любым непустым значением .

Private Sub Worksheet_Change(ByVal Target As Range)
    Application.ScreenUpdating = False
  If Target.Address = "$B$3" Then
    If IsEmpty(Sheet1.Range("B3")) = False Then
       Sheets("A").Visible = True
    Else 
       Sheets("A").Visible = False
    End If
  End If


        ''etc etc and so on

 Application.ScreenUpdating = True
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...