Страницы: 1 2 След.
RSS
Игнорирование команды по удалению листов в книге
 
Подскажите готовый макрос по перехвату команды по удалении листа из книги, Что бы определенные листы было не возможно удалить из книги.
с параметром Private Sub Worksheet_BeforeDelete()
 
Доброе время суток.
Вряд ли такой макрос есть. Нет событий в объектной модели, которые бы отслеживали удаление рабочих листов, листов диаграмм, листов диалогов. которые помимо регистрации удаления, позволяли бы отменять действия пользователя (например, событие Workbook_BeforeSave - имеет возможность блокировать собственно сохранение в файл).
Как выход. Защитить структуру книги под пароль и предоставить возможность удалять/добавлять листы в книгу только посредством макросов (на период выполнения которых, снимаете, а затем снова устанавливаете пароль).
Изменено: Андрей VG - 01.09.2019 08:39:29 (Не акуратно сформулировал)
 
Андрей VG, Привет. Ну если нет пути перехватить "вредное" событие то можно предотвратить его появление :-). Как можно удалить лист? ПКМ - элементарно залочить меню. Правда, при выделении нескольких листов и с главным меню нужно пошаманить, но нет ничего невозможного :-).
По вопросам из тем форума, личку не читаю.
 
Андрей VG, БМВ, доброго утра!  :)

Был удивлён, что действительно нельзя "запретить" удаление (во всяком случае обычными методами) — оно произойдёт, даже если переименовать лист…
Проблема также в том, что нет события Workbook_SheetAfterDelete, чтобы можно было "подшаманить костыли", чтобы пользователь не увидел внутренней "кухни".

Используем свойство неотвратимости удаления (лист будет удалён, даже, если переименован):
В модуль книги
Цитата
Kazanildarik: с параметром Private Sub Worksheet_BeforeDelete()
не получится (я не знаю, как), т.к. это событие сидит в модуле листа, а лист будет удалён. Модуль книги намного удобнее для этого

UPD: метод от Андрея VG из #2 сработает. Защита включится перед удалением, что не даст удалить лист и отключится по событию Workbook_SheetSelectionChange, то есть нужно будет всего лишь кликнуть в любом месте
В модуль книги
Изменено: Jack Famous - 01.09.2019 12:05:05
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
У меня в книге, 8 конкретных листов нужны. Остальные добавляются и удаляются пользователем по мере необходимости
Можно не нарошно удалить один из этих листов, А восставить потом проблемно очень.
Так как, пользователя определелить что можно удалять что нельзя?
 
Цитата
Kazanildarik: 8 конкретных листов нужны
Для метода с защитой книги (на примере 3х листов):

Цитата
Kazanildarik: Так как, пользователю определить что можно удалять что нельзя?
если речь не о макросах, а об алгоритме, то можно помечать ярлыки важных листов красным, например. Ну а если нужно быть уверенным, что шаловливые ручноки юзеров не дотянутся до удаления, то
Цитата
Андрей VG: Как выход. Защитить структуру книги под пароль и предоставить возможность удалять/добавлять листы в книгу только посредством макросов (на период выполнения которых, снимаете, а затем снова устанавливаете пароль)
или
Цитата
БМВ: если нет пути перехватить "вредное" событие то можно предотвратить его появление…залочить меню
Изменено: Jack Famous - 01.09.2019 12:18:18
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Kazanildarik написал: Можно не нарошно удалить один из этих листов
Заходите с другой стороны. Пользователям рассказать, что удалять листы ТОЛЬКО через форму пользвателя.
На форме ListBox с перечнем листов и кнопка удаления. Где-то список нужных листов. Пользователь выделяет строку, жмет кнопку... А не тут-то было!  или макрос любезно соглашается.
 
Код
Private Sub Workbook_SheetBeforeDelete(ByVal Sh As Object)
    If Sh.Name Like "Test*" Then
        ThisWorkbook.Protect , True
        Application.OnTime Now, "UnprotectBook"
    End If
End Sub

и
Код
Sub UnprotectBook()
    ThisWorkbook.Unprotect
End Sub
В свой лимит уложился. :-)
Изменено: БМВ - 01.09.2019 12:28:27
По вопросам из тем форума, личку не читаю.
 
Kazanildarik, если через форму, как предложил vikttur, то как вариант, можно, чтобы "запретных" листов просто не было в списке

БМВ, а я вот не подумал про отсрочку  :D  а что такое "свр1"? увидел, что опечатка…
Изменено: Jack Famous - 01.09.2019 12:42:00
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Привет, Михаил.
Отличное решение, спасибо. Только вот что делать с Можнонеосторожно-пользователями? Они же нечаянно могут и выполнение макросов отключить, ну так из любопытства ради :)
Изменено: Андрей VG - 01.09.2019 13:01:50
 
Андрей VG, Андрей, приветствую. Ну мне кажется мое отношение ко всем продуктам основанным на excel, как к полуфабрикатам я неоднократно заявлял. Это помощник, но любого помощника можно уговорить сделать что-то не то :-)
По вопросам из тем форума, личку не читаю.
 
Мяу, люди! Тут сурьезно сверкает
Код
Private Sub Workbook_SheetBeforeDelete(ByVal Sh As Object)

У меня лыжи не едут? Чи шо?
 
Цитата
RAN: У меня лыжи не едут? Чи шо?
смотря что вы имеете ввиду… Ну есть такое событие книги перед удалением листа, и?
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
Для метода с защитой книги (на примере 3х листов):
Сделал. Спасибо за участие.
В другие макросы где меняется структура книги, добавил строку на снятие защиты книги.
Теперь нужные вкладки не удалить.
 
Цитата
Jack Famous написал:
Ну есть такое событие книги перед удалением листа, и?
В какой версии?
 
Цитата
Юрий М написал:
В какой версии?
Здравствуйте, коллеги! Начиная с Excel 2013. Разработчики (по-видимому) забыли про параметр Cancel.
Изменено: sokol92 - 01.09.2019 14:26:12
Владимир
 
Цитата
Kazanildarik: Сделал
С учётом найденного решения от БМВ в #8 должно получиться как-то так

sokol92, приветствую!
Юрий М, у меня:
Изменено: Jack Famous - 01.09.2019 14:27:45
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
2010 - не нахожу такого события (
 
Юрий М, значит самое время обновляться (или нет)  ;)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Это на работе. Дома 2013 ))
Стало быть, предложенный вариант не очень универсальный. Я про тех, кто остановился на 2010 :-]
 
Цитата
Юрий М написал:
Я про тех, кто остановился на 2010 :-]
а тех кто остановился на Электроника МК-61 не волнует удаление листов :-)
По вопросам из тем форума, личку не читаю.
 
Гы )) Вечно медведь что-нибудь замутит...
Ну, а если серьёзно - ведь достаточно больше количество людей остались на 2010: зайдут на форум, скачают вариант, а потом вопить будут - "Не работает!" ))
 
Цитата
БМВ написал:
тех кто остановился на Электроника МК-61 не волнует
их волнует, как обойтись 14 регистрами памяти, а не 15 для совместимости с Б3-34 :)
 
Цитата
Юрий М: предложенный вариант не очень универсальный…кто остановился на 2010
есть вариант от vikttur в #7

БМВ,  :D
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
БМВ написал:
а тех кто остановился на Электроника МК-61 не волнует удаление листов :-)
у меня в блоке расширения памяти была одна секретная подпрограмма, которая позволяла это сделать (и БЗ-34 был, врать не буду, на нем не получилось сделать)))
Изменено: Ігор Гончаренко - 01.09.2019 15:03:21
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Ігор Гончаренко написал:
у меня в блоке расширения памяти
Игорь, это уже была Электроника МК-52 :D  не зачёт.
 
Цитата
Юрий М написал:
"Не работает!"
А вот это будет волновать ровно до октября следующего года :-)
А если серьезно, то если это честный купленный 2010, то надо задумываться о переходе и просто планировать бюджет. Если нет, то все тоже самое, но есть варианты :-).
По вопросам из тем форума, личку не читаю.
 
Миш, я о другом:
- А кто у нас муж?
- Волшебник.
- Предупреждать нужно.
:D  
 
У меня не получается ни перехватить нажатие "Удалить" в меню листа, ни изменить OnAction.
Владимир
 
Цитата
sokol92 написал:
У меня не получается ни перехватить нажатие "Удалить" в меню листа
Добрый вечер, Владимир.
А версия Excel какая? С 2016 метод Михаила работает.
Страницы: 1 2 След.
Наверх