Страницы: 1 2 След.
RSS
скрыть/отобразить несколько листов
 
Добрый день!  
В прикрепленной книге есть основной лист и несколько листов которые нужно скрыть или отобразить. Сейчас сделано так, что на основном листе вводишь имя листа который нужно скрыть или отобразить и соответствующие кнопки для этого. А вот возник вопрос, как обработать сразу несколько листов, т.е. в ячейку ввести сразу несколько имен листов через запятую или точку с запятой и обработать их?  
Подсобите, плиз
 
Извиняюсь, не прикрепился файл. Вот
 
{quote}{login=roka}{date=10.11.2010 12:13}{thema=скрыть/отобразить несколько листов}{post}Добрый день!  
В прикрепленной книге есть основной лист и несколько листов которые нужно скрыть или отобразить. Сейчас сделано так, что на основном листе вводишь имя листа который нужно скрыть или отобразить и соответствующие кнопки для этого. А вот возник вопрос, как обработать сразу несколько листов, т.е. в ячейку ввести сразу несколько имен листов через запятую или точку с запятой и обработать их?  
Подсобите, плиз{/post}{/quote}  
 
 
Добрый день  
 
А код макроса покажите
 
{quote}{login=webley}{date=10.11.2010 12:21}{thema=Re: скрыть/отобразить несколько листов}{post}{quote}{login=roka}{date=10.11.2010 12:13}{thema=скрыть/отобразить несколько листов}{post}Добрый день!  
В прикрепленной книге есть основной лист и несколько листов которые нужно скрыть или отобразить. Сейчас сделано так, что на основном листе вводишь имя листа который нужно скрыть или отобразить и соответствующие кнопки для этого. А вот возник вопрос, как обработать сразу несколько листов, т.е. в ячейку ввести сразу несколько имен листов через запятую или точку с запятой и обработать их?  
Подсобите, плиз{/post}{/quote}  
В прикрепленном файле  
 
Добрый день  
 
А код макроса покажите{/post}{/quote}
 
Имена листов через запятую.  
Private Sub CommandButton1_Click()  
Dim namelist  
   namelist = Split(Sheets("!").Cells(2, 2).Value, ",")  
For i = 0 To UBound(namelist)  
   Sheets(namelist(i)).Visible = True  
Next  
End Sub  
 
Private Sub CommandButton2_Click()  
Dim namelist  
   namelist = Split(Sheets("!").Cells(2, 2).Value, ",")  
For i = 0 To UBound(namelist)  
   Sheets(namelist(i)).Visible = False  
Next  
End Sub  
 
55155
Я сам - дурнее всякого примера! ...
 
раз уж сделал - выложу  
мыслил также :)
 
.
Я сам - дурнее всякого примера! ...
 
Всем большое спасибо!
 
Руками вводить имена / номера листов - это "не комильфо" :-)  
Вот как бы формочку сделать, в которой можно выбирать, какие из видимых листов скрыть, а какие из скрытых отобразить...  
Каждый раз лазить в Формат-Лист-Отобразить, там выбирать по одному листу и их отображать - жутко ломает, особенно если скрытых листов не один-два, а с десяток...  
Скрыть то несколько листов сразу - не вопрос... А вот отображать их потом по одному...  
Я уж начал для этого просто свойства листов Visible в VBE ручками менять между  xlVisible xlHidden и xlVeryHidden
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=Alex_ST}{date=10.11.2010 12:53}{thema=}{post}Руками вводить имена / номера листов - это "не комильфо" :-)  
Вот как бы формочку сделать, в которой можно выбирать, какие из видимых листов скрыть, а какие из скрытых отобразить...  
Каждый раз лазить в Формат-Лист-Отобразить, там выбирать по одному листу и их отображать - жутко ломает, особенно если скрытых листов не один-два, а с десяток...  
Скрыть то несколько листов сразу - не вопрос... А вот отображать их потом по одному...  
Я уж начал для этого просто свойства листов Visible в VBE ручками менять между  xlVisible xlHidden и xlVeryHidden{/post}{/quote}  
 
формочку можно сделать примерно вот так
 
На основе файла с темы Сергея (Serge 007).  
 
P.S. Может много лишнего или наоборот, лень было что-то менять...
<FONT COLOR="CadetBlue">
 
класс, из этого может получиться неплохая кнопочка
 
webley,  
С П А С И Б О ! ! !  
Отличное и простое решение!  
Ща "лачком покрою" и к себе в Персонал положу, да кнопулечку сделаю!
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=Alex_ST}{date=10.11.2010 02:23}{thema=}{post}webley,  
С П А С И Б О ! ! !  
Отличное и простое решение!  
Ща "лачком покрою" и к себе в Персонал положу, да кнопулечку сделаю!{/post}{/quote}  
 
я тут сейчас подумал - макрос на кнопку ОК надо подкорректировать:  
Private Sub cmdOK_Click()  
   For i = 0 To Me.ListBox1.ListCount - 1  
       If Me.ListBox1.Selected(i) = True Then ActiveWorkbook.Sheets(Me.ListBox1.List(i)).Visible = True  
   Next i  
   For i = 0 To Me.ListBox1.ListCount - 1  
       On Error Resume Next  
           If Me.ListBox1.Selected(i) = False Then ActiveWorkbook.Sheets(Me.ListBox1.List(i)).Visible = False  
       On Error GoTo 0  
   Next i  
   Unload Me  
End Sub  
 
в первоначальной версии возможен такой глюк: например, в книге 2 листа - первый видимый, а второй нет. Если на форме отметить, что первый невидимый, а второй наоборот видимый, то ничего не произойдет, т.к. сначала excel попытается скрыть единственный видимый лист. Выход - сначала отобразить все листы, которые должны быть видимыми, а потом скрыть все листы, которые должны быть невидемыми
 
кнопочкой потом поделиться не забудьте, плиз ;)
 
Да, с всего двумя листами, действительно при одном проходе циклом лажа получается.  
Тогда так:  
Private Sub cmdOK_Click()  
  Dim i%  
  On Error Resume Next  
  For i = 0 To Me.ListBox1.ListCount - 1  
     ActiveWorkbook.Sheets(Me.ListBox1.List(i)).Visible = Me.ListBox1.Selected(i)  
  Next  
  For i = 0 To Me.ListBox1.ListCount - 1  
     ActiveWorkbook.Sheets(Me.ListBox1.List(i)).Visible = Me.ListBox1.Selected(i)  
  Next  
  On Error GoTo 0  
  Unload Me  
End Sub
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Самое интересное, что если сделать так:  
Private Sub UserForm_Initialize()  
  Dim sh As Worksheet, i%  
  For Each sh In ActiveWorkbook.Sheets  
     Me.ListBox1.AddItem sh.Name  
  Next  
  For i = 0 To Me.ListBox1.ListCount - 1  
     If ActiveWorkbook.Sheets(Me.ListBox1.List(i)).Visible Then Me.ListBox1.Selected(i) = True  
  Next  
End Sub  
то в листбокс выводятся также и листы, которые были VeryHidden т.к. в цикле по i If не различает значения xlSheetVisible = -1 == True и xlSheetVeryHidden = 2 (т.е. CBool(xlSheetVeryHidden) = True)
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Ну, раз уж webley уже на что-то другое отвлёкся, то я выложу по просьбам зрителей...  
 
Понятно, чем отличается "Спрятать" от "Заныкать"? :-)
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=Alex_ST}{date=10.11.2010 04:14}{thema=}{post}Ну, раз уж webley уже на что-то другое отвлёкся, то я выложу по просьбам зрителей...  
 
Понятно, чем отличается "Спрятать" от "Заныкать"? :-){/post}{/quote}  
 
так кнопочку от вас ждали, а не от меня :)
 
Да...  
Назвался клизмой...  
 
Да и мне теперь пришлось не одну кнопочку "Спрятать" в панель управления выводить, а две - ещё и "Заныкать"  
Надо подумать, как одну и ту же форму для разных действий вызывать...  
Как-то ведь была на Планете тема про передачу форме аргументов без использования Public-переменных... Но где и как искать?  
Кажется, какой-то из экзотических никем не используемых параметров формы использовали???
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
О!  
Нашёл. Через Tag можно стринг передать.  
Ща попробую объединить две формы в одну.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Alex_ST  
ну раз уж ... так, то надо надстройкой оформить с бУтонами ;)
 
ни фига не хочет, зар-р-р-аза, Tag у ещё не открытой формы ставиться...  
Ладно, завтра доделаю...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Оказывается, что установленный у закрытой формы перед её вызовом Tag только при UserForm_Initialize не всегда читается правильно...  
А при UserForm_Activate - всё О.К.  
Всё сделал. Максимально сократил код.  
 
А надстройки делать я не мастак. Может, кто-нибудь из спецов возьмётся...  
Тогда в надстройке это надо бы не батонами на новую панель добавить, а дополнительными пунктами в меню листа (то, которое по ПКМ на ярлыке листа показывается).
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
тема заинтересовала - решил попробовать решить задачу еще одним способом. Результат в прикрепленном файле
 
webley,  
КРУТО!  
Я и сам уже думал, как бы сделать что-то типа листбокса с возможностью "почекать" три состояния...    
Ща во время обеденного бутерброда "помусолю". Поразбираюсь, как ты там что сделал...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=roka}{date=10.11.2010 04:38}{thema=}{post}Alex_ST  
ну раз уж ... так, то надо надстройкой оформить с бУтонами ;){/post}{/quote}  
 
ну и вариант надстройки - добавляет пункт к контекстному меню (которое появляется при нажатии на название листа)
 
Надстройка отличная.  
Очень удобно!  
Только никак не соображу синтаксиса, чтобы аналогичную команду вставить ещё и в главное меню "Worksheet Menu Bar" в меню "Формат" (Name="Format", ID=30006) после пункта "Лист..." (ID=30026)...  
К индексу или Caption меню привязываться не хочется, т.к. при настройке "под себя" эти параметры пунктов меню у разных пользователей могут быть разные...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=Alex_ST}{date=11.11.2010 03:15}{thema=}{post}Надстройка отличная.  
Очень удобно!  
Только никак не соображу синтаксиса, чтобы аналогичную команду вставить ещё и в главное меню "Worksheet Menu Bar" в меню "Формат" (Name="Format", ID=30006) после пункта "Лист..." (ID=30026)...  
К индексу или Caption меню привязываться не хочется, т.к. при настройке "под себя" эти параметры пунктов меню у разных пользователей могут быть разные...{/post}{/quote}  
 
Боюсь, что с этим вопросом надо обратиться к кому-нибудь более знающему - это моя первая надстройка, делал по книге Уокенбаха :)
 
webley,  
не прибедняйтесь  
Код формы написан замечательно. Практически никаких лишних действий.  
А динамическое программное формирование фрэймов - супер!  
Только я бы может, расстановку в фрэймах кОнтролов сделал отдельной подпрограммкой. Код покороче будет. Хотя и так не длинный.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
Страницы: 1 2 След.
Читают тему
Наверх