Чтобы помочь оптимизировать работу и улучшить внешний вид, используйте 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