Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Сократить код - Мир MS Excel

Старая форма входа
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: китин, _Boroda_  
Сократить код
Serge_007 Дата: Понедельник, 09.07.2012, 19:52 | Сообщение № 1
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Написал тут такой код (Требования: Есть книга состоящая, как минимум, из 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]

Вопрос: Можно его принципиально сократить?


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
СообщениеНаписал тут такой код (Требования: Есть книга состоящая, как минимум, из 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
Дата добавления - 09.07.2012 в 19:52
Michael_S Дата: Понедельник, 09.07.2012, 19:59 | Сообщение № 2
Группа: Друзья
Ранг: Старожил
Сообщений: 2012
Репутация: 373 ±
Замечаний: 0% ±

Excel2016
Можно, но зависит от названий листов или их расположения.

зы. Впрочем, имхо, зачем сокращать? Мне кажется, этот код достаточно быстрым.
Мой вариант будет медленнее, хоть и короче.

зы.зы. И еще..
Quote
Если на листе "Лист1" в ячейке А1 значение 1, то отображаются все листы.

имеются ввиду ВСЕ листы (в условии - листов может быть и больше трех), или только заданные?


Сообщение отредактировал Michael_S - Понедельник, 09.07.2012, 20:07
 
Ответить
СообщениеМожно, но зависит от названий листов или их расположения.

зы. Впрочем, имхо, зачем сокращать? Мне кажется, этот код достаточно быстрым.
Мой вариант будет медленнее, хоть и короче.

зы.зы. И еще..
Quote
Если на листе "Лист1" в ячейке А1 значение 1, то отображаются все листы.

имеются ввиду ВСЕ листы (в условии - листов может быть и больше трех), или только заданные?

Автор - Michael_S
Дата добавления - 09.07.2012 в 19:59
Serge_007 Дата: Понедельник, 09.07.2012, 20:09 | Сообщение № 3
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Quote (Michael_S)
Можно, но зависит от названий листов или их расположения

Названия листов и их расположение как при создании нового файла в русской локали, т.е по порядку, слева-направо: Лист1, Лист2, Лист3 и т.д.
Всегда только так.

Quote (Michael_S)
зачем сокращать? Мне кажется, этот код достаточно быстрым

Тут дело не в скорости. Это что-то типа VBA-избушки, интересен сам принцип

Quote (Michael_S)
имеются ввиду ВСЕ листы (в условии - листов может быть и больше трех), или только заданные?

Quote (Serge_007)
Если в книге есть другие листы, то с ними ничего происходить не должно.


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
Сообщение
Quote (Michael_S)
Можно, но зависит от названий листов или их расположения

Названия листов и их расположение как при создании нового файла в русской локали, т.е по порядку, слева-направо: Лист1, Лист2, Лист3 и т.д.
Всегда только так.

Quote (Michael_S)
зачем сокращать? Мне кажется, этот код достаточно быстрым

Тут дело не в скорости. Это что-то типа VBA-избушки, интересен сам принцип

Quote (Michael_S)
имеются ввиду ВСЕ листы (в условии - листов может быть и больше трех), или только заданные?

Quote (Serge_007)
Если в книге есть другие листы, то с ними ничего происходить не должно.

Автор - Serge_007
Дата добавления - 09.07.2012 в 20:09
Michael_S Дата: Понедельник, 09.07.2012, 20:57 | Сообщение № 4
Группа: Друзья
Ранг: Старожил
Сообщений: 2012
Репутация: 373 ±
Замечаний: 0% ±

Excel2016
[vba]
Code
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
Sheets(2).Visible = 2 <> [a1]
Sheets(3).Visible = 3 <> [a1]
Application.ScreenUpdating = True
End Sub
[/vba]
 
Ответить
Сообщение[vba]
Code
Private Sub Worksheet_Change(ByVal Target As Range)
Application.ScreenUpdating = False
Sheets(2).Visible = 2 <> [a1]
Sheets(3).Visible = 3 <> [a1]
Application.ScreenUpdating = True
End Sub
[/vba]

Автор - Michael_S
Дата добавления - 09.07.2012 в 20:57
Serge_007 Дата: Понедельник, 09.07.2012, 21:04 | Сообщение № 5
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Спс, завтра проверю (сейчас экса под рукой нет)


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
СообщениеСпс, завтра проверю (сейчас экса под рукой нет)

Автор - Serge_007
Дата добавления - 09.07.2012 в 21:04
RAN Дата: Понедельник, 09.07.2012, 21:36 | Сообщение № 6
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Для уяснения принципа
[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]
Сработает правильно, даже если потребуется скрыть Лист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]
Сработает правильно, даже если потребуется скрыть Лист1

Автор - RAN
Дата добавления - 09.07.2012 в 21:36
Serge_007 Дата: Понедельник, 09.07.2012, 21:42 | Сообщение № 7
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Quote (RAN)
Dim sh As Worksheet
' отображаем все
For Each sh In Worksheets: sh.Visible = True: Next

А так возможно скрытые другие листы не отобразятся?


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
Сообщение
Quote (RAN)
Dim sh As Worksheet
' отображаем все
For Each sh In Worksheets: sh.Visible = True: Next

А так возможно скрытые другие листы не отобразятся?

Автор - Serge_007
Дата добавления - 09.07.2012 в 21:42
Саня Дата: Понедельник, 09.07.2012, 21:59 | Сообщение № 8
Группа: Друзья
Ранг: Ветеран
Сообщений: 1068
Репутация: 560 ±
Замечаний: 0% ±

XL 2016
я бы сделал так (почему везде ячейка А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
[/vba]

Автор - Саня
Дата добавления - 09.07.2012 в 21:59
Serge_007 Дата: Понедельник, 09.07.2012, 22:17 | Сообщение № 9
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Quote (Саня)
я бы сделал так

Саш, так длиннее получается smile


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
Сообщение
Quote (Саня)
я бы сделал так

Саш, так длиннее получается smile

Автор - Serge_007
Дата добавления - 09.07.2012 в 22:17
RAN Дата: Понедельник, 09.07.2012, 22:34 | Сообщение № 10
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Зато читать проще.


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеЗато читать проще.

Автор - RAN
Дата добавления - 09.07.2012 в 22:34
LightZ Дата: Понедельник, 09.07.2012, 22:37 | Сообщение № 11
Группа: Авторы
Ранг: Форумчанин
Сообщений: 120
Репутация: 48 ±
Замечаний: 0% ±

[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
[/vba]


E-mail: overseerpower@gmail.com
Skype: Bogdan_Rud
WMR: R166238237296
 
Ответить
Сообщение[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
[/vba]

Автор - LightZ
Дата добавления - 09.07.2012 в 22:37
Саня Дата: Понедельник, 09.07.2012, 22:53 | Сообщение № 12
Группа: Друзья
Ранг: Ветеран
Сообщений: 1068
Репутация: 560 ±
Замечаний: 0% ±

XL 2016
Quote (Serge_007)
Саш, так длиннее получается

Сереж, ты буквы или кол-во строк считаешь?
Сообщения 4 и 11 смотри тогда...

До сих пор не пойму - это обработчик событий - все коды отрабатывают при изменении в любой ячейке(ах) на листе, это нормально?
 
Ответить
Сообщение
Quote (Serge_007)
Саш, так длиннее получается

Сереж, ты буквы или кол-во строк считаешь?
Сообщения 4 и 11 смотри тогда...

До сих пор не пойму - это обработчик событий - все коды отрабатывают при изменении в любой ячейке(ах) на листе, это нормально?

Автор - Саня
Дата добавления - 09.07.2012 в 22:53
KuklP Дата: Понедельник, 09.07.2012, 23:43 | Сообщение № 13
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
Вариант:
[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
[/vba]


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728
 
Ответить
СообщениеВариант:
[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
[/vba]

Автор - KuklP
Дата добавления - 09.07.2012 в 23:43
Michael_S Дата: Вторник, 10.07.2012, 00:29 | Сообщение № 14
Группа: Друзья
Ранг: Старожил
Сообщений: 2012
Репутация: 373 ±
Замечаний: 0% ±

Excel2016
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
?
 
Ответить
Сообщение
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
Дата добавления - 10.07.2012 в 00:29
KuklP Дата: Вторник, 10.07.2012, 00:35 | Сообщение № 15
Группа: Проверенные
Ранг: Старожил
Сообщений: 2369
Репутация: 486 ±
Замечаний: 0% ±

2003-2010
Ступил, можно без этого:-)


Ну с НДС и мы чего-то стoим! kuklp60@gmail.com
WM Z206653985942, R334086032478, U238399322728


Сообщение отредактировал KuklP - Вторник, 10.07.2012, 00:37
 
Ответить
СообщениеСтупил, можно без этого:-)

Автор - KuklP
Дата добавления - 10.07.2012 в 00:35
Serge_007 Дата: Вторник, 10.07.2012, 09:19 | Сообщение № 16
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Проверил все коды, спасибо, все рабочие.

ЗЫ У Андрея, как я и предполагал, при 1 отображаются все листы книги, а не только первые три


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
СообщениеПроверил все коды, спасибо, все рабочие.

ЗЫ У Андрея, как я и предполагал, при 1 отображаются все листы книги, а не только первые три

Автор - Serge_007
Дата добавления - 10.07.2012 в 09:19
Alex_ST Дата: Вторник, 10.07.2012, 22:03 | Сообщение № 17
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3213
Репутация: 609 ±
Замечаний: 0% ±

2003
Серёга,
а вот так можно вообще на любые страницы распространить:
[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]
Всего-то и нужно что перечислить их номера через пробел



С уважением,
Алексей
MS Excel 2003 - the best!!!


Сообщение отредактировал Alex_ST - Вторник, 10.07.2012, 22:04
 
Ответить
СообщениеСерёга,
а вот так можно вообще на любые страницы распространить:
[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
Дата добавления - 10.07.2012 в 22:03
Serge_007 Дата: Вторник, 10.07.2012, 22:06 | Сообщение № 18
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Самый короткий код получился у Михаила, им и воспользовался smile


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
СообщениеСамый короткий код получился у Михаила, им и воспользовался smile

Автор - Serge_007
Дата добавления - 10.07.2012 в 22:06
Alex_ST Дата: Вторник, 10.07.2012, 22:11 | Сообщение № 19
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3213
Репутация: 609 ±
Замечаний: 0% ±

2003
Он короткий если тебе нужно работать с двумя страницами.
А попробуй-ка сделать то же самое хотя бы с пятью?
У кого короче тогда получится?



С уважением,
Алексей
MS Excel 2003 - the best!!!
 
Ответить
СообщениеОн короткий если тебе нужно работать с двумя страницами.
А попробуй-ка сделать то же самое хотя бы с пятью?
У кого короче тогда получится?

Автор - Alex_ST
Дата добавления - 10.07.2012 в 22:11
Serge_007 Дата: Вторник, 10.07.2012, 22:15 | Сообщение № 20
Группа: Админы
Ранг: Местный житель
Сообщений: 16475
Репутация: 2749 ±
Замечаний: ±

Excel 2016
Quote (Alex_ST)
Он короткий если тебе нужно работать с двумя страницами.
А попробуй-ка сделать то же самое хотя бы с пятью?


Мне с пятью не надо. Я в условиях прописал - если есть другие листы, то с ними ничего происходить не должно


ЮMoney:41001419691823 | WMR:126292472390
 
Ответить
Сообщение
Quote (Alex_ST)
Он короткий если тебе нужно работать с двумя страницами.
А попробуй-ка сделать то же самое хотя бы с пятью?


Мне с пятью не надо. Я в условиях прописал - если есть другие листы, то с ними ничего происходить не должно

Автор - Serge_007
Дата добавления - 10.07.2012 в 22:15
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!