Написал тут такой код (Требования: Есть книга состоящая, как минимум, из 3 листов "Лист1", "Лист2", "Лист3", возможно наличие и других листов. На листе "Лист1" в ячейке А1 условие (2 или 3) В зависимости от данных в ячейке А1 на листе "Лист1" листы - "Лист2" или "Лист3" должны скрываться. Если на листе "Лист1" в ячейке А1 значение 1, то отображаются все листы. Если в книге есть другие листы, то с ними ничего происходить не должно. После любого выбора надо возвращаться на Лист1):
[vba]
Code
Private Sub Worksheet_Change(ByVal Target As Range) Application.ScreenUpdating = False If Sheets("Лист1").Range("A1") = 2 Then Sheets("Лист2").Visible = False Sheets("Лист3").Visible = True ElseIf Sheets("Лист1").Range("A1") = 3 Then Sheets("Лист3").Visible = False Sheets("Лист2").Visible = True ElseIf Sheets("Лист1").Range("A1") = 1 Then Sheets("Лист3").Visible = True Sheets("Лист2").Visible = True End If Sheets("Лист1").Select Application.ScreenUpdating = True End Sub
[/vba]
Вопрос: Можно его принципиально сократить?
Написал тут такой код (Требования: Есть книга состоящая, как минимум, из 3 листов "Лист1", "Лист2", "Лист3", возможно наличие и других листов. На листе "Лист1" в ячейке А1 условие (2 или 3) В зависимости от данных в ячейке А1 на листе "Лист1" листы - "Лист2" или "Лист3" должны скрываться. Если на листе "Лист1" в ячейке А1 значение 1, то отображаются все листы. Если в книге есть другие листы, то с ними ничего происходить не должно. После любого выбора надо возвращаться на Лист1):
[vba]
Code
Private Sub Worksheet_Change(ByVal Target As Range) Application.ScreenUpdating = False If Sheets("Лист1").Range("A1") = 2 Then Sheets("Лист2").Visible = False Sheets("Лист3").Visible = True ElseIf Sheets("Лист1").Range("A1") = 3 Then Sheets("Лист3").Visible = False Sheets("Лист2").Visible = True ElseIf Sheets("Лист1").Range("A1") = 1 Then Sheets("Лист3").Visible = True Sheets("Лист2").Visible = True End If Sheets("Лист1").Select Application.ScreenUpdating = True End Sub
[/vba]
Вопрос: Можно его принципиально сократить?Serge_007
Можно, но зависит от названий листов или их расположения
Названия листов и их расположение как при создании нового файла в русской локали, т.е по порядку, слева-направо: Лист1, Лист2, Лист3 и т.д. Всегда только так.
Quote (Michael_S)
зачем сокращать? Мне кажется, этот код достаточно быстрым
Тут дело не в скорости. Это что-то типа VBA-избушки, интересен сам принцип
Quote (Michael_S)
имеются ввиду ВСЕ листы (в условии - листов может быть и больше трех), или только заданные?
Quote (Serge_007)
Если в книге есть другие листы, то с ними ничего происходить не должно.
Quote (Michael_S)
Можно, но зависит от названий листов или их расположения
Названия листов и их расположение как при создании нового файла в русской локали, т.е по порядку, слева-направо: Лист1, Лист2, Лист3 и т.д. Всегда только так.
Quote (Michael_S)
зачем сокращать? Мне кажется, этот код достаточно быстрым
Тут дело не в скорости. Это что-то типа VBA-избушки, интересен сам принцип
Quote (Michael_S)
имеются ввиду ВСЕ листы (в условии - листов может быть и больше трех), или только заданные?
Quote (Serge_007)
Если в книге есть другие листы, то с ними ничего происходить не должно.
Private Sub Worksheet_Change(ByVal Target As Range) Dim sh As Worksheet ' отображаем все For Each sh In Worksheets: sh.Visible = True: Next ' прячем лишнее If Sheets(1).Range("A1") = 2 Then Sheets("Лист2").Visible = False ElseIf Sheets(1).Range("A1") = 3 Then: Sheets("Лист3").Visible = False End If End
[/vba] Сработает правильно, даже если потребуется скрыть Лист1
Для уяснения принципа [vba]
Code
Private Sub Worksheet_Change(ByVal Target As Range) Dim sh As Worksheet ' отображаем все For Each sh In Worksheets: sh.Visible = True: Next ' прячем лишнее If Sheets(1).Range("A1") = 2 Then Sheets("Лист2").Visible = False ElseIf Sheets(1).Range("A1") = 3 Then: Sheets("Лист3").Visible = False End If End
[/vba] Сработает правильно, даже если потребуется скрыть Лист1RAN
я бы сделал так (почему везде ячейка А1 - это ж обработчик события): [vba]
Code
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub
Application.ScreenUpdating = False Dim bVis2 As Boolean: bVis2 = True Dim bVis3 As Boolean: bVis3 = True
Select Case Target.Value Case 1 ' ничего не меняем Case 2: bVis2 = False Case 3: bVis3 = False Case Else Application.Quit ' черный юмор Application.SendKeys "{Enter}"
End Select
Sheets("Лист2").Visible = bVis2 Sheets("Лист3").Visible = bVis3 Application.ScreenUpdating = True End Sub
[/vba]
я бы сделал так (почему везде ячейка А1 - это ж обработчик события): [vba]
Code
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub
Application.ScreenUpdating = False Dim bVis2 As Boolean: bVis2 = True Dim bVis3 As Boolean: bVis3 = True
Select Case Target.Value Case 1 ' ничего не меняем Case 2: bVis2 = False Case 3: bVis3 = False Case Else Application.Quit ' черный юмор Application.SendKeys "{Enter}"
End Select
Sheets("Лист2").Visible = bVis2 Sheets("Лист3").Visible = bVis3 Application.ScreenUpdating = True End Sub
Private Sub Worksheet_Change(ByVal Target As Range) Dim Sh2 As Worksheet: Dim sh3 As Worksheet: Set Sh2 = Sheets(2): Set sh3 = Sheets(3) If [a1] = 1 Then Sh2.Visible = 1: sh3.Visible = 1 If [a1] = 2 Then Sh2.Visible = 0: sh3.Visible = 1 If [a1] = 3 Then Sh2.Visible = 1: sh3.Visible = 0 End Sub
[/vba]
[vba]
Code
Private Sub Worksheet_Change(ByVal Target As Range) Dim Sh2 As Worksheet: Dim sh3 As Worksheet: Set Sh2 = Sheets(2): Set sh3 = Sheets(3) If [a1] = 1 Then Sh2.Visible = 1: sh3.Visible = 1 If [a1] = 2 Then Sh2.Visible = 0: sh3.Visible = 1 If [a1] = 3 Then Sh2.Visible = 1: sh3.Visible = 0 End Sub
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub Sheets("Лист2").Visible = -1 Sheets("Лист3").Visible = -1 Sheets("Лист2").Visible = [A1] <> 2 Sheets("Лист3").Visible = [A1] <> 3 End Sub
[/vba]
Вариант: [vba]
Code
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub Sheets("Лист2").Visible = -1 Sheets("Лист3").Visible = -1 Sheets("Лист2").Visible = [A1] <> 2 Sheets("Лист3").Visible = [A1] <> 3 End Sub
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub Sheets("Лист2").Visible = -1 Sheets("Лист3").Visible = -1 Sheets("Лист2").Visible = [A1] <> 2 Sheets("Лист3").Visible = [A1] <> 3 End Sub
А зачем здесь Sheets("Лист2").Visible = -1 Sheets("Лист3").Visible = -1 ?
Quote (KuklP)
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub Sheets("Лист2").Visible = -1 Sheets("Лист3").Visible = -1 Sheets("Лист2").Visible = [A1] <> 2 Sheets("Лист3").Visible = [A1] <> 3 End Sub
А зачем здесь Sheets("Лист2").Visible = -1 Sheets("Лист3").Visible = -1 ?Michael_S
Серёга, а вот так можно вообще на любые страницы распространить: [vba]
Code
Private Sub Worksheet_Change(ByVal Target As Range) Dim x Application.ScreenUpdating = False For Each x In Split("2 3") Worksheets(CInt(x)).Visible = CInt(x) <> [a1] Next x Application.ScreenUpdating = True End Sub
[/vba] Всего-то и нужно что перечислить их номера через пробел
Серёга, а вот так можно вообще на любые страницы распространить: [vba]
Code
Private Sub Worksheet_Change(ByVal Target As Range) Dim x Application.ScreenUpdating = False For Each x In Split("2 3") Worksheets(CInt(x)).Visible = CInt(x) <> [a1] Next x Application.ScreenUpdating = True End Sub
[/vba] Всего-то и нужно что перечислить их номера через пробелAlex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Вторник, 10.07.2012, 22:04