Если вы хотите предотвратить удаление определенного листа в Excel, попробуйте метод, описанный в этой статье.
Предотвратить удаление определенного рабочего листа с помощью кода VBA
Предотвратить удаление определенного рабочего листа с помощью кода VBA
Приведенный ниже код VBA может помочь вам предотвратить удаление определенного рабочего листа в Excel. Пожалуйста, сделайте следующее.
1. Откройте рабочий лист, который вы не хотите удалять, щелкните правой кнопкой мыши вкладку листа и нажмите Просмотреть код из контекстного меню.
2. в Microsoft Visual Basic для приложений окна, скопируйте и вставьте приведенный ниже код VBA в окно кода.
Код VBA: запретить удаление определенного рабочего листа в Excel
Private Sub Worksheet_Activate()
ThisWorkbook.Protect "yourpassword"
End Sub
Private Sub Worksheet_Deactivate()
ThisWorkbook.Unprotect "yourpassword"
End Sub
Внимание: В коде замените «yourpassword» своим настоящим паролем.
3. нажмите другой + Q клавиши одновременно, чтобы закрыть Microsoft Visual Basic для приложений окно.
4. Перейдите на другой рабочий лист и снова вернитесь к нему, чтобы активировать код VBA.
5. Щелкните правой кнопкой мыши вкладку листа, вы увидите Удалить Параметр серый и отключен среди параметров, как показано на скриншоте ниже.
Статьи по теме:
- Как предотвратить удаление определенного содержимого ячеек в Excel?
- Как предотвратить выбор нескольких листов в Excel?
Лучшие инструменты для работы в офисе
Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%
- Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
- Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон…
- Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны…
- Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
- Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
- Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии…
- Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
- Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF…
- Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.
Вкладка Office: интерфейс с вкладками в Office и упрощение работы
- Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
- Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
- Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!
Комментарии (6)
Оценок пока нет. Оцените первым!
Protecting workbook structure will prevent a user from deleting sheets. But how could I (using VBA) prevent a user from deleting a particular sheet I designate? I’ve seen examples where an active sheet is prevented from deletion by
Set mymenubar = CommandBars.ActiveMenuBar
mymenubar.Controls("Edit").Controls("Delete sheet").Visible = False
in its Worksheet_Activate
event but that of course only works if the sheet is activated.
Is there a way to prevent a sheet from being deleted whether active or no?
For clarity: I’m fine with the user deleting some sheets, just not a couple of particular sheets.
So protecting workbook structure won’t work.
asked May 14, 2014 at 4:55
3
As far as I can tell, it isn’t possible to natively tag a single sheet as non-deletable; and there isn’t an event that can be used to detect when a sheet is about to be deleted so the workbook can be protected preventively.
However, here is one potential workaround:
- Protect workbook structure: this will, as you indicate, prevent all sheets from being deleted.
- Create a «Controls» sheet. On this sheet, maintain a list of all sheet names (except those you don’t want to be deletable).
- If users want to delete a sheet, they will have to select its name on the Controls sheet (e.g. in a data validation drop-down menu) and press a «Delete» button. This button will call a macro that temporarily unprotects the workbook, deletes the selected sheet, and then reprotects the workbook.
Of course, the users will have to get used to this way of deleting sheets (as opposed to just right-click > Delete on the sheet’s tab). Still, this isn’t crazy complicated.
As for how to achieve #2 i.e. maintaining that list of sheet names, I suppose you could make use of a UDF like this one (must be called as an array formula):
Function DeletableSheetNames() As String()
Application.Volatile
Dim i As Long
Dim sn() As String
With ThisWorkbook
ReDim sn(1 To .Sheets.Count)
For i = 1 To .Sheets.Count
With .Sheets(i)
If .Name = "DataEntry1" Or .Name = "DataEntry2" Then
'Don't include it in the list.
Else
sn(i) = .Name
End If
End With
Next i
End With
DeletableSheetNames = sn
End Function
answered May 14, 2014 at 7:12
You cannot stop users to delete a particular sheet but you could use the Workbook_BeforeSave()
event to prevent the workbook from being saved if a particular sheet is missing. The documentation on this event precisely shows how to allow saving a workbook only when certain conditions are met. See http://msdn.microsoft.com/en-us/library/office/ff840057(v=office.14).aspx
answered May 14, 2014 at 6:43
1
I can prevent a sheet from being deleted via the Worksheet_BeforeDelete Event as follows:
Private Sub Worksheet_BeforeDelete()
Call ThisWorkbook.Protect("password")
Call MsgBox("This sheet cannot be deleted.", vbExclamation)
End Sub
This protects all sheets from being deleted, however if you add some event code on the ThisWorkbook module like the following :
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Call ThisWorkbook.Unprotect("password")
End Sub
I will then be able to delete any other sheet as soon as it is selected.
Bear in mind, you will lose copy and paste functionality between pages due to the page unlocking when it is selected.
WonderWorker
8,4094 gold badges61 silver badges73 bronze badges
answered Aug 22, 2015 at 13:04
«there isn’t an event that can be used to detect when a sheet is about to be deleted»
Since Office 2013, it is possible with the SheetBeforeDelete event.
answered Jun 2, 2018 at 3:54
I found this solution, similar to Dan’s, on ExtendOffice.com. Put this code on the Worksheet’s module:
Private Sub Worksheet_Activate()
ThisWorkbook.Protect "yourpassword"
End Sub
Private Sub Worksheet_Deactivate()
ThisWorkbook.Unprotect "yourpassword"
End Sub
When you activate the sheet in question, the whole workbook is protected, and the «Delete» option is grayed out. When you switch to any other sheet, the workbook is free again. It’s subtle because you only notice the change when you go to the «safe» sheet.
answered Mar 12, 2018 at 21:24
Shawn V. WilsonShawn V. Wilson
9783 gold badges15 silver badges39 bronze badges
1
Answer is by adding the following code to each of the protected sheets:
Private Sub Worksheet_Deactivate()
ThisWorkbook.Protect , True
Application.OnTime Now, "UnprotectBook"
End Sub
And the following to a Module:
Sub UnprotectBook()
ThisWorkbook.Unprotect
End Sub
Check https://www.top-password.com/blog/prevent-excel-sheet-from-being-deleted/ for credits accordingly.
answered Sep 26, 2019 at 6:45
The following disables the menu when you right click on tab. This stops the delete option being available.
Sub tab_rclick_off()
Application.CommandBars("Ply").Enabled = False
End Sub
The following turns the menu back on.
Sub tab_rclick_on()
Application.CommandBars("Ply").Enabled = True
End Sub
This option is simple, concise, prevents any issues with data entry/editing with protected sheets and can be called from anywhere in code, ie in conjunction with log on permissions can be given to some and not others etc. foremost yourself.
answered Oct 2, 2022 at 19:21
Maybe you could try to protect the structure of the workbook in SheetBeforeDelete.
See my example:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
ThisWorkbook.Protect Structure:=False
End Sub
Private Sub Workbook_SheetBeforeDelete(ByVal Sh As Object)
If Sh.Name = "Example" Then
ThisWorkbook.Protect Structure:=True
End If
End Sub
answered Dec 25, 2020 at 15:26
EvertEvert
112 bronze badges
Here is another answer from mine base on the idea of @Jean-François Corbett
You can use ‘Protect WB Structure’ and Event ‘Workbook_SheetBeforeDelete’ to achieve this.
The result is that an dialog will pop up said «Workbook is protected and cannot be changed.»
Private Sub zPreventWShDel(WSh As Worksheet, Protection As Boolean)
Dim zPassword As String: zPassword = ""
Dim zWB As Workbook
Set zWB = WSh.Parent
If Protection Then
zWB.Protect zPassword, Protection
Else
zWB.Protect zPassword, Protection
End If
'Stop
End Sub
Private Sub Workbook_SheetBeforeDelete(ByVal Sh As Object)
Call zPreventWShDel(Sh, True)
End Sub
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Call zPreventWShDel(Sh, False)
End Sub
Do not Call the code on Sheet Deactivation like below. Because it will deactivate it. Sequence of running is Event_SheetBeforeDelete -> Event_SheetDeactivate.
Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)
Call zPreventWShDel(Sh, False)
End Sub
answered Mar 12, 2022 at 7:52
I created a different approach to this.
On the sheet(s) you want protected, add this code:
Private Sub Worksheet_BeforeDelete()
ThisWorkbook.Worksheets("Unprotect Workbook").Visible = True
ThisWorkbook.Worksheets("Unprotect Workbook").Activate
ThisWorkbook.Protect
End Sub
Create the («Unprotect Workbook») sheet and make the visibility: xlSheetVeryHidden
on the «Unprotect Workbook» sheet add a button or shape that you can assign a macro to.
on the «Unprotect Workbook» sheet, add this code:
Sub unprotectThisWorkbook()
ThisWorkbook.unprotect
ActiveSheet.Visible = xlSheetVeryHidden
End Sub
Assign the sub you added, «Sub unprotectThisWorkbook()», to the button on the «Unprotect Worksheet» sheet
When you delete the sheet you protected, the workbook is protected and it takes you to the unprotect worksheet as a notice to the user and as a way to unprotect the workbook. Once the button is clicked, the workbook is unprotected and the «unprotect sheet» is hidden again.
This will work for any sheet you want to protect.
answered Dec 13, 2022 at 19:35
Подскажите готовый макрос по перехвату команды по удалении листа из книги, Что бы определенные листы было не возможно удалить из книги. |
|
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
Доброе время суток.
которые помимо регистрации удаления, позволяли бы отменять действия пользователя (например, событие Workbook_BeforeSave — имеет возможность блокировать собственно сохранение в файл). Изменено: Андрей VG — 01.09.2019 08:39:29 |
БМВ Модератор Сообщений: 21383 Excel 2013, 2016 |
Андрей VG, Привет. Ну если нет пути перехватить «вредное» событие то можно предотвратить его появление :-). Как можно удалить лист? ПКМ — элементарно залочить меню. Правда, при выделении нескольких листов и с главным меню нужно пошаманить, но нет ничего невозможного :-). По вопросам из тем форума, личку не читаю. |
Jack Famous Пользователь Сообщений: 10850 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
#4 01.09.2019 11:47:23 Андрей VG, БМВ, доброго утра! Был удивлён, что действительно нельзя «запретить» удаление (во всяком случае обычными методами) — оно произойдёт, даже если переименовать лист… Используем свойство неотвратимости удаления (лист будет удалён, даже, если переименован):
не получится (я не знаю, как), т.к. это событие сидит в модуле листа, а лист будет удалён. Модуль книги намного удобнее для этого UPD: метод от Андрея VG из #2 сработает. Защита включится перед удалением, что не даст удалить лист и отключится по событию Workbook_SheetSelectionChange, то есть нужно будет всего лишь кликнуть в любом месте
Прикрепленные файлы
Изменено: Jack Famous — 01.09.2019 12:05:05 Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
||||
У меня в книге, 8 конкретных листов нужны. Остальные добавляются и удаляются пользователем по мере необходимости |
|
Jack Famous Пользователь Сообщений: 10850 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
#6 01.09.2019 12:11:01
если речь не о макросах, а об алгоритме, то можно помечать ярлыки важных листов красным, например. Ну а если нужно быть уверенным, что шаловливые ручноки юзеров не дотянутся до удаления, то
или
Изменено: Jack Famous — 01.09.2019 12:18:18 Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
|||||||||
vikttur Пользователь Сообщений: 47199 |
#7 01.09.2019 12:24:12
Заходите с другой стороны. Пользователям рассказать, что удалять листы ТОЛЬКО через форму пользвателя. |
||
БМВ Модератор Сообщений: 21383 Excel 2013, 2016 |
#8 01.09.2019 12:27:06
и
В свой лимит уложился. Изменено: БМВ — 01.09.2019 12:28:27 По вопросам из тем форума, личку не читаю. |
||||
Jack Famous Пользователь Сообщений: 10850 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
Kazanildarik, если через форму, как предложил vikttur, то как вариант, можно, чтобы «запретных» листов просто не было в списке БМВ, а я вот не подумал про отсрочку
увидел, что опечатка… Изменено: Jack Famous — 01.09.2019 12:42:00 Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
Привет, Михаил. Изменено: Андрей VG — 01.09.2019 13:01:50 |
БМВ Модератор Сообщений: 21383 Excel 2013, 2016 |
Андрей VG, Андрей, приветствую. Ну мне кажется мое отношение ко всем продуктам основанным на excel, как к полуфабрикатам я неоднократно заявлял. Это помощник, но любого помощника можно уговорить сделать что-то не то По вопросам из тем форума, личку не читаю. |
RAN Пользователь Сообщений: 7091 |
#12 01.09.2019 13:52:08 Мяу, люди! Тут сурьезно сверкает
У меня лыжи не едут? Чи шо? |
||
Jack Famous Пользователь Сообщений: 10850 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
#13 01.09.2019 14:00:42
смотря что вы имеете ввиду… Ну есть такое событие книги перед удалением листа, и? Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
||
Kazanildarik Пользователь Сообщений: 38 |
#14 01.09.2019 14:01:11
Сделал. Спасибо за участие. |
||
Юрий М Модератор Сообщений: 60584 Контакты см. в профиле |
#15 01.09.2019 14:11:20
В какой версии? |
||
sokol92 Пользователь Сообщений: 4445 |
#16 01.09.2019 14:21:05
Здравствуйте, коллеги! Начиная с Excel 2013 . Разработчики (по-видимому) забыли про параметр Cancel. Изменено: sokol92 — 01.09.2019 14:26:12 Владимир |
||
Jack Famous Пользователь Сообщений: 10850 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
#17 01.09.2019 14:21:38
sokol92, приветствую! Прикрепленные файлы
Изменено: Jack Famous — 01.09.2019 14:27:45 Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
|||
Юрий М Модератор Сообщений: 60584 Контакты см. в профиле |
2010 — не нахожу такого события ( |
Jack Famous Пользователь Сообщений: 10850 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
Юрий М, значит самое время обновляться (или нет) Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
Юрий М Модератор Сообщений: 60584 Контакты см. в профиле |
Это на работе. Дома 2013 )) |
БМВ Модератор Сообщений: 21383 Excel 2013, 2016 |
#21 01.09.2019 14:36:28
а тех кто остановился на Электроника МК-61 не волнует удаление листов По вопросам из тем форума, личку не читаю. |
||
Юрий М Модератор Сообщений: 60584 Контакты см. в профиле |
Гы )) Вечно медведь что-нибудь замутит… |
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
#23 01.09.2019 14:41:21
их волнует, как обойтись 14 регистрами памяти, а не 15 для совместимости с Б3-34 |
||
Jack Famous Пользователь Сообщений: 10850 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
#24 01.09.2019 14:42:15
есть вариант от vikttur в #7 БМВ, Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
||
Ігор Гончаренко Пользователь Сообщений: 13746 |
#25 01.09.2019 14:59:26
у меня в блоке расширения памяти была одна секретная подпрограмма, которая позволяла это сделать (и БЗ-34 был, врать не буду, на нем не получилось сделать))) Изменено: Ігор Гончаренко — 01.09.2019 15:03:21 Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
||
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
#26 01.09.2019 15:05:10
Игорь, это уже была Электроника МК-52
|
||
БМВ Модератор Сообщений: 21383 Excel 2013, 2016 |
#27 01.09.2019 15:05:53
А вот это будет волновать ровно до октября следующего года По вопросам из тем форума, личку не читаю. |
||
Юрий М Модератор Сообщений: 60584 Контакты см. в профиле |
Миш, я о другом: |
sokol92 Пользователь Сообщений: 4445 |
У меня не получается ни перехватить нажатие «Удалить» в меню листа, ни изменить OnAction. |
Андрей VG Пользователь Сообщений: 11878 Excel 2016, 365 |
#30 01.09.2019 16:26:09
Добрый вечер, Владимир. Прикрепленные файлы
|
||
Насколько я могу судить, невозможно изначально пометить один лист как не подлежащий удалению; и нет события, которое может быть использовано для обнаружения, когда лист собирается быть удален, чтобы книга могла быть защищена превентивно.
Однако, вот один из возможных способов:
- Защитить структуру рабочей книги: это, как вы укажете, предотвратит удаление всех листов.
- Создайте лист «Элементы управления». На этом листе поддерживайте список всех имен листов (кроме тех, которые вы не хотите удалять).
- Если пользователи хотят удалить лист, они должны будут выбрать его имя на листе «Элементы управления» (например, в раскрывающемся меню проверки данных) и нажмите кнопку «Удалить». Эта кнопка вызывает макрос, который временно защищает рабочую книгу, удаляет выбранный лист и затем воспроизводит книгу.
Конечно, пользователям придется привыкнуть к этому способу удаления листов (а не просто щелкнуть правой кнопкой мыши> Удалить на вкладке листа). Тем не менее, это не сумасшествие сложно.
Что касается того, как достичь # 2, т. е. поддерживать этот список имен листов, я полагаю, вы могли бы использовать UDF, подобный этому (его нужно вызывать как формулу массива):
Function DeletableSheetNames() As String()
Application.Volatile
Dim i As Long
Dim sn() As String
With ThisWorkbook
ReDim sn(1 To .Sheets.Count)
For i = 1 To .Sheets.Count
With .Sheets(i)
If .Name = "DataEntry1" Or .Name = "DataEntry2" Then
'Don't include it in the list.
Else
sn(i) = .Name
End If
End With
Next i
End With
DeletableSheetNames = sn
End Function
ответ дан Jean-François Corbett 17 August 2018 в 08:46
поделиться
4377 / 661 / 36 Регистрация: 17.01.2010 Сообщений: 2,134 |
|
1 |
|
Запретить удаление листа?03.05.2010, 10:10. Показов 7052. Ответов 2
Как запретить исключительно средствами VBA — я знаю. А каким образом запретить средствами VBA удаление, например, Sheets(«Лист1»), когда оно выполняется обычным способом (правая клавиша на ярлыке -> Удалить лист), с последующим сообщением MsgBox «Удаление этого листа запрещено»? Буду благодарен за совет.
0 |
аналитика здесь больше нет… 3372 / 1670 / 184 Регистрация: 03.02.2010 Сообщений: 1,219 |
||||
13.05.2010, 13:22 |
2 |
|||
1 |
0 / 0 / 0 Регистрация: 21.11.2016 Сообщений: 37 |
|
02.07.2010, 18:49 |
3 |
А нельзя ли поподробнее…. Может не сложно пример приложить? Добавлено через 27 секунд Может не сложно пример приложить?
0 |