|
Компьютерный форум OSzone.net » Сфера Microsoft » Microsoft Office (Word, Excel, Outlook и т.д.) » 2016 - [решено] Excel - VBA - скрытие всех листов кроме перечисленных |
|
|
2016 - [решено] Excel - VBA - скрытие всех листов кроме перечисленных
|
(*.*) Сообщения: 36567 |
Всем привет!
В книге Excel есть 3 листа, которые должны отображаться всегда, а также N листов, которые нужно скрывать. Скрытые листы должны отображаться только при переходе по ссылке из первых трех. Нагуглил такой код Private Sub Worksheet_Activate() Dim ws As Worksheet For Each ws In ThisWorkbook.Worksheets If InStr(1, ws.Name, "Main", vbTextCompare) = 0 Then ws.Visible = False End If Next ws End Sub Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink) With Worksheets(Target.Range.Value) .Visible = True .Activate .Range("A1").Select End With End Sub Видимо, надо загнать все отображаемые листы в переменную и сравнивать их по очереди, но не могу сообразить, как это сделать. Подскажете? Спасибо! |
|
------- Отправлено: 13:14, 04-09-2017 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Честно говоря, не очень понял суть, но по сравнению я бы высказался так — имеющийся код:
ищет «Main» внутри имени очередного листа, а не делает точное сравнение со всей частью (как, например, в «If StrComp(ws.Name, "Main", vbTextCompare) = 0 Then») Можно делать последовательное сравнение: If StrComp(ws.Name, "Main", vbTextCompare) = 0 Or StrComp(ws.Name, "Main1", vbTextCompare) = 0 Or StrComp(ws.Name, "Main2", vbTextCompare) = 0 Then Можно (с теми же оговорками) пробовать регулярку, наподобие: На выбор. |
Отправлено: 13:54, 04-09-2017 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
(*.*) Сообщения: 36567
|
Профиль | Сайт | Отправить PM | Цитировать Iska, мне неважно, будет он искать часть имени или все имя. Имена будут другие, их можно хардкодить.
Этот вариант работает, если во всех именах отображаемых листов будет Main Но в реальности имена этих листов будут разные, без общего паттерна. Последовательное сравнение через Or не работает, оно скрывает листы Main или вылетает с ошибкой. Прикрепляю файл, код в первом листе. |
------- Отправлено: 16:43, 04-09-2017 | #3 |
Динохромный Сообщения: 710
|
Профиль | Отправить PM | Цитировать Цитата Vadikan:
If Not (StrComp(ws.Name, "Main1", vbTextCompare) = 0 Or StrComp(ws.Name, "Main2", vbTextCompare) = 0 Or StrComp(ws.Name, "Main3", vbTextCompare) = 0) Then Цитата Vadikan:
Private Sub Worksheet_Activate() Dim ws As Worksheet Dim strNames As String strNames = "Main1,Main2,Main3": ' Перечень листов через запятую, который можно менять strNames = "," & strNames & "," For Each ws In ThisWorkbook.Worksheets If Not InStr(strNames, "," & ws.Name & ",") <> 0 Then ws.Visible = False End If Next ws End Sub |
||
Отправлено: 17:54, 04-09-2017 | #4 |
(*.*) Сообщения: 36567
|
Профиль | Сайт | Отправить PM | Цитировать a_axe, вот так я это и представлял, спасибо!
С условием not понял. |
|
Отправлено: 19:54, 04-09-2017 | #5 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Как я понимаю, процедуру «Worksheet_Activate()» придётся поместить в модуль каждого рабочего листа, кроме скрытых «Screen1» («Screen2», «Screen3» и т.д.), и процедуру «Worksheet_FollowHyperlink()» — в модуль каждого листа с подобными гиперссылками. Мне это не очень нравится.
Ещё мне не очень нравится то, что скрытые листы легко отображаются по команде меню (в моей версии \Формат\Лист\Отобразить…). Это явным образом противоречит: Цитата Vadikan:
Посему я предлагаю несколько иной код, размещённый только в одном модуле — «ThisWorkbook»: Скрытый текст
Option Explicit Private arrMainGroupWorksheets As Variant ' Массив для имён всегда отображаемых листов, заполняется в процедуре при открытии Рабочей книги Private Sub Workbook_Open() arrMainGroupWorksheets = Array("Main1", "Main2", "Main3") ' Задаём имена всегда отображаемых листов End Sub Private Sub Workbook_SheetActivate(ByVal objCurrWorksheet As Object) Dim objWorksheet As Worksheet If IsInMainGroupOfWorksheets(objCurrWorksheet) Then ' Если выделенный Рабочий лист входит в группу всегда отображаемых листов, то сейчас надо пройтись перебором по всем Рабочим листам и скрыть их все, кроме всегда отображаемых. For Each objWorksheet In objCurrWorksheet.Parent.Worksheets ' …для каждого Рабочего листа Рабочей книги выделенного Рабочего листа… If Not IsInMainGroupOfWorksheets(objWorksheet) Then ' Если очередной Рабочий лист не входит в группу всегда отображаемых листов, то… objWorksheet.Visible = xlVeryHidden ' …скрываем его. End If Next End If End Sub Private Sub Workbook_SheetFollowHyperlink(ByVal objWorksheet As Object, ByVal Target As Hyperlink) With Worksheets.Item(Target.Range.Value) .Visible = True .Activate .Range(Target.SubAddress).Select End With End Sub Function IsInMainGroupOfWorksheets(objWorksheet As Worksheet) ' Проверяем, входит ли переданный Рабочий лист в группу всегда отображаемых листов Dim strWorksheetName As Variant IsInMainGroupOfWorksheets = False ' Предположим, что не входит For Each strWorksheetName In arrMainGroupWorksheets ' Перебираем все имена из массива всегда отображаемых листов If StrComp(objWorksheet.Name, strWorksheetName, vbTextCompare) = 0 Then ' Если имя переданного Рабочего листа совпало с каким-либо именем из массива, то… IsInMainGroupOfWorksheets = True ' Утверждаем, что входит и… Exit Function ' Выходим из функции End If Next End Function И сама Рабочая книга в архиве: TestHyperlinks2.7z. Разумеется, если я правильно понял потребности. |
|
Последний раз редактировалось Iska, 05-09-2017 в 09:33. Причина: Ненужный пробел перед запятой. Отправлено: 05:17, 05-09-2017 | #6 |
(*.*) Сообщения: 36567
|
Профиль | Сайт | Отправить PM | Цитировать Цитата Iska:
Цитата Iska:
Меня тут другой вопрос заинтересовал. По поводу этого кода В листе есть не только гиперссылки на скрытые листы, но и обычные веб-ссылки. При переходе по ним вылетает дебаггер, хотя ссылки открываются. Можно как-то ограничить действие функции определенным столбцом, например? |
||
------- Отправлено: 21:21, 05-09-2017 | #7 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата Vadikan:
Можно также смотреть на адрес ссылки (Target.Address), и если он начинается с http:// — то пропускать обработку. |
|
Отправлено: 21:34, 05-09-2017 | #8 |
(*.*) Сообщения: 36567
|
Профиль | Сайт | Отправить PM | Цитировать Iska, да, именно это, спасибо!
|
------- Отправлено: 21:59, 05-09-2017 | #9 |
(*.*) Сообщения: 36567
|
Профиль | Сайт | Отправить PM | Цитировать Возникла необходимость изменить функциональность скрипта (дублирую пост 4)
Private Sub Worksheet_Activate() Dim ws As Worksheet Dim strNames As String strNames = "Main1,Main2,Main3": ' Перечень листов через запятую, который можно менять strNames = "," & strNames & "," For Each ws In ThisWorkbook.Worksheets If Not InStr(strNames, "," & ws.Name & ",") <> 0 Then ws.Visible = False End If Next ws End Sub Список А - листы всегда отображаются (strNames) Список Б (условный) - все остальные листы, которые отображаются при переходе по ссылке из списка А и скрываются при возвращении на лист из списка А Вместо этого нужно не скрываются до закрытия книги. Другими словами, при открытии книги только список А, а во время работы с книгой список А и все листы из списка Б, которые были активированы при переходе из списка А. Поможете? |
------- Отправлено: 16:26, 25-11-2017 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Удаление всех файлов (всех типов) из всех подпапок, кроме расширений txt | kot318 | Скриптовые языки администрирования Windows | 10 | 12-02-2015 15:48 | |
2007 - [решено] Перебор листов и ячеек в VBA | alef2474 | Microsoft Office (Word, Excel, Outlook и т.д.) | 6 | 13-01-2013 18:28 | |
VBA - Объекты в VBA (Excel) | zena | Программирование и базы данных | 9 | 18-02-2012 20:36 |
|