Как запретить удаление листа в excel vba

Если вы хотите предотвратить удаление определенного листа в 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-дневная гарантия возврата денег.

вкладка kte 201905


Вкладка 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.

Community's user avatar

asked May 14, 2014 at 4:55

user3474688's user avatar

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:

  1. Protect workbook structure: this will, as you indicate, prevent all sheets from being deleted.
  2. Create a «Controls» sheet. On this sheet, maintain a list of all sheet names (except those you don’t want to be deletable).
  3. 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

Jean-François Corbett's user avatar

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

jemenfou's user avatar

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's user avatar

WonderWorker

8,4094 gold badges61 silver badges73 bronze badges

answered Aug 22, 2015 at 13:04

Dan McCormick's user avatar

«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

Travis Banger's user avatar

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. Wilson's user avatar

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

Francisco Costa's user avatar

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

Pat 74's user avatar

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

Evert's user avatar

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

Khoa Nguyen's user avatar

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.

Unprotect Sheet Example

answered Dec 13, 2022 at 19:35

JoeyFlaum's user avatar

 

Подскажите готовый макрос по перехвату команды по удалении листа из книги, Что бы определенные листы было не возможно удалить из книги.
с параметром Private Sub Worksheet_BeforeDelete()

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

Доброе время суток.
Вряд ли такой макрос есть. Нет событий в объектной модели,

которые бы отслеживали удаление рабочих листов, листов диаграмм, листов диалогов.

которые помимо регистрации удаления, позволяли бы отменять действия пользователя (например, событие Workbook_BeforeSave — имеет возможность блокировать собственно сохранение в файл).
Как выход. Защитить структуру книги под пароль и предоставить возможность удалять/добавлять листы в книгу только посредством макросов (на период выполнения которых, снимаете, а затем снова устанавливаете пароль).

Изменено: Андрей VG01.09.2019 08:39:29
(Не акуратно сформулировал)

 

БМВ

Модератор

Сообщений: 21383
Регистрация: 28.12.2016

Excel 2013, 2016

Андрей VG, Привет. Ну если нет пути перехватить «вредное» событие то можно предотвратить его появление :-). Как можно удалить лист? ПКМ — элементарно залочить меню. Правда, при выделении нескольких листов и с главным меню нужно пошаманить, но нет ничего невозможного :-).

По вопросам из тем форума, личку не читаю.

 

Jack Famous

Пользователь

Сообщений: 10850
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#4

01.09.2019 11:47:23

Андрей VG, БМВ, доброго утра!  :)

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

Используем свойство неотвратимости удаления (лист будет удалён, даже, если переименован):

В модуль книги

Цитата
Kazanildarik: с параметром Private Sub Worksheet_BeforeDelete()

не получится (я не знаю, как), т.к. это событие сидит в модуле листа, а лист будет удалён. Модуль книги намного удобнее для этого

UPD: метод от Андрея VG из #2 сработает. Защита включится перед удалением, что не даст удалить лист и отключится по событию Workbook_SheetSelectionChange, то есть нужно будет всего лишь кликнуть в любом месте

В модуль книги

Прикрепленные файлы

  • Удалить нельзя оставить.xlsb (15.8 КБ)

Изменено: Jack Famous01.09.2019 12:05:05

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

У меня в книге, 8 конкретных листов нужны. Остальные добавляются и удаляются пользователем по мере необходимости
Можно не нарошно удалить один из этих листов, А восставить потом проблемно очень.
Так как, пользователя определелить что можно удалять что нельзя?

 

Jack Famous

Пользователь

Сообщений: 10850
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#6

01.09.2019 12:11:01

Цитата
Kazanildarik: 8 конкретных листов нужны

Для метода с защитой книги (на примере 3х листов):

Цитата
Kazanildarik: Так как, пользователю определить что можно удалять что нельзя?

если речь не о макросах, а об алгоритме, то можно помечать ярлыки важных листов красным, например. Ну а если нужно быть уверенным, что шаловливые ручноки юзеров не дотянутся до удаления, то

Цитата
Андрей VG: Как выход. Защитить структуру книги под пароль и предоставить возможность удалять/добавлять листы в книгу только посредством макросов (на период выполнения которых, снимаете, а затем снова устанавливаете пароль)

или

Цитата
БМВ: если нет пути перехватить «вредное» событие то можно предотвратить его появление…залочить меню

Изменено: Jack Famous01.09.2019 12:18:18

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

#7

01.09.2019 12:24:12

Цитата
Kazanildarik написал: Можно не нарошно удалить один из этих листов

Заходите с другой стороны. Пользователям рассказать, что удалять листы ТОЛЬКО через форму пользвателя.
На форме ListBox с перечнем листов и кнопка удаления. Где-то список нужных листов. Пользователь выделяет строку, жмет кнопку… А не тут-то было!  или макрос любезно соглашается.

 

БМВ

Модератор

Сообщений: 21383
Регистрация: 28.12.2016

Excel 2013, 2016

#8

01.09.2019 12:27:06

Код
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

По вопросам из тем форума, личку не читаю.

 

Jack Famous

Пользователь

Сообщений: 10850
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

Kazanildarik, если через форму, как предложил vikttur, то как вариант, можно, чтобы «запретных» листов просто не было в списке

БМВ, а я вот не подумал про отсрочку  :D

а что такое «свр1»?

увидел, что опечатка…

Изменено: Jack Famous01.09.2019 12:42:00

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

Привет, Михаил.
Отличное решение, спасибо. Только вот что делать с Можнонеосторожно-пользователями? Они же нечаянно могут и выполнение макросов отключить, ну так из любопытства ради :)

Изменено: Андрей VG01.09.2019 13:01:50

 

БМВ

Модератор

Сообщений: 21383
Регистрация: 28.12.2016

Excel 2013, 2016

Андрей VG, Андрей, приветствую. Ну мне кажется мое отношение ко всем продуктам основанным на excel, как к полуфабрикатам я неоднократно заявлял. Это помощник, но любого помощника можно уговорить сделать что-то не то :-)

По вопросам из тем форума, личку не читаю.

 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

#12

01.09.2019 13:52:08

Мяу, люди! Тут сурьезно сверкает

Код
Private Sub Workbook_SheetBeforeDelete(ByVal Sh As Object)

У меня лыжи не едут? Чи шо?

 

Jack Famous

Пользователь

Сообщений: 10850
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#13

01.09.2019 14:00:42

Цитата
RAN: У меня лыжи не едут? Чи шо?

смотря что вы имеете ввиду… Ну есть такое событие книги перед удалением листа, и?

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Kazanildarik

Пользователь

Сообщений: 38
Регистрация: 06.04.2017

#14

01.09.2019 14:01:11

Цитата
Jack Famous написал:
Для метода с защитой книги (на примере 3х листов):

Сделал. Спасибо за участие.
В другие макросы где меняется структура книги, добавил строку на снятие защиты книги.
Теперь нужные вкладки не удалить.

 

Юрий М

Модератор

Сообщений: 60584
Регистрация: 14.09.2012

Контакты см. в профиле

#15

01.09.2019 14:11:20

Цитата
Jack Famous написал:
Ну есть такое событие книги перед удалением листа, и?

В какой версии?

 

sokol92

Пользователь

Сообщений: 4445
Регистрация: 10.09.2017

#16

01.09.2019 14:21:05

Цитата
Юрий М написал:
В какой версии?

Здравствуйте, коллеги! Начиная с

Excel 2013

. Разработчики (по-видимому) забыли про параметр Cancel.

Изменено: sokol9201.09.2019 14:26:12

Владимир

 

Jack Famous

Пользователь

Сообщений: 10850
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#17

01.09.2019 14:21:38

Цитата
Kazanildarik: Сделал

С учётом найденного решения от БМВ в #8 должно получиться как-то так

sokol92, приветствую!
Юрий М, у меня:

Прикрепленные файлы

  • _ПАРАМЕТРЫ EXCEL.png (6.22 КБ)

Изменено: Jack Famous01.09.2019 14:27:45

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Юрий М

Модератор

Сообщений: 60584
Регистрация: 14.09.2012

Контакты см. в профиле

2010 — не нахожу такого события (

 

Jack Famous

Пользователь

Сообщений: 10850
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

Юрий М, значит самое время обновляться (или нет)  ;)

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Юрий М

Модератор

Сообщений: 60584
Регистрация: 14.09.2012

Контакты см. в профиле

Это на работе. Дома 2013 ))
Стало быть, предложенный вариант не очень универсальный. Я про тех, кто остановился на 2010 :-]

 

БМВ

Модератор

Сообщений: 21383
Регистрация: 28.12.2016

Excel 2013, 2016

#21

01.09.2019 14:36:28

Цитата
Юрий М написал:
Я про тех, кто остановился на 2010 :-]

а тех кто остановился на Электроника МК-61 не волнует удаление листов :-)

По вопросам из тем форума, личку не читаю.

 

Юрий М

Модератор

Сообщений: 60584
Регистрация: 14.09.2012

Контакты см. в профиле

Гы )) Вечно медведь что-нибудь замутит…
Ну, а если серьёзно — ведь достаточно больше количество людей остались на 2010: зайдут на форум, скачают вариант, а потом вопить будут — «Не работает!» ))

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#23

01.09.2019 14:41:21

Цитата
БМВ написал:
тех кто остановился на Электроника МК-61 не волнует

их волнует, как обойтись 14 регистрами памяти, а не 15 для совместимости с Б3-34 :)

 

Jack Famous

Пользователь

Сообщений: 10850
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#24

01.09.2019 14:42:15

Цитата
Юрий М: предложенный вариант не очень универсальный…кто остановился на 2010

есть вариант от vikttur в #7

БМВ,  :D

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Ігор Гончаренко

Пользователь

Сообщений: 13746
Регистрация: 01.01.1970

#25

01.09.2019 14:59:26

Цитата
БМВ написал:
а тех кто остановился на Электроника МК-61 не волнует удаление листов :-)

у меня в блоке расширения памяти была одна секретная подпрограмма, которая позволяла это сделать (и БЗ-34 был, врать не буду, на нем не получилось сделать)))

Изменено: Ігор Гончаренко01.09.2019 15:03:21

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#26

01.09.2019 15:05:10

Цитата
Ігор Гончаренко написал:
у меня в блоке расширения памяти

Игорь, это уже была

Электроника МК-52

:D  не зачёт.

 

БМВ

Модератор

Сообщений: 21383
Регистрация: 28.12.2016

Excel 2013, 2016

#27

01.09.2019 15:05:53

Цитата
Юрий М написал:
«Не работает!»

А вот это будет волновать ровно до октября следующего года :-)
А если серьезно, то если это честный купленный 2010, то надо задумываться о переходе и просто планировать бюджет. Если нет, то все тоже самое, но есть варианты :-).

По вопросам из тем форума, личку не читаю.

 

Юрий М

Модератор

Сообщений: 60584
Регистрация: 14.09.2012

Контакты см. в профиле

Миш, я о другом:
— А кто у нас муж?
— Волшебник.
Предупреждать нужно.
:D  

 

sokol92

Пользователь

Сообщений: 4445
Регистрация: 10.09.2017

У меня не получается ни перехватить нажатие «Удалить» в меню листа, ни изменить OnAction.

 

Андрей VG

Пользователь

Сообщений: 11878
Регистрация: 22.12.2012

Excel 2016, 365

#30

01.09.2019 16:26:09

Цитата
sokol92 написал:
У меня не получается ни перехватить нажатие «Удалить» в меню листа

Добрый вечер, Владимир.
А версия Excel какая? С 2016 метод Михаила работает.

Прикрепленные файлы

  • delSheet.xlsb (16.03 КБ)

Насколько я могу судить, невозможно изначально пометить один лист как не подлежащий удалению; и нет события, которое может быть использовано для обнаружения, когда лист собирается быть удален, чтобы книга могла быть защищена превентивно.

Однако, вот один из возможных способов:

  1. Защитить структуру рабочей книги: это, как вы укажете, предотвратит удаление всех листов.
  2. Создайте лист «Элементы управления». На этом листе поддерживайте список всех имен листов (кроме тех, которые вы не хотите удалять).
  3. Если пользователи хотят удалить лист, они должны будут выбрать его имя на листе «Элементы управления» (например, в раскрывающемся меню проверки данных) и нажмите кнопку «Удалить». Эта кнопка вызывает макрос, который временно защищает рабочую книгу, удаляет выбранный лист и затем воспроизводит книгу.

Конечно, пользователям придется привыкнуть к этому способу удаления листов (а не просто щелкнуть правой кнопкой мыши> Удалить на вкладке листа). Тем не менее, это не сумасшествие сложно.

Что касается того, как достичь # 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

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub SetMenu()
   CommandBars("Ply").Controls(2).OnAction = "aaa"
End Sub
 
                                          Sub aaa()
                                             If ActiveSheet.Name = "Лист1" Then
                                                MsgBox "Нельзя!!!"
                                             Else
                                                ActiveSheet.Delete
                                             End If
                                          End Sub
 
 
Sub ResetMenu()
   CommandBars("Ply").Reset
End Sub



1



0 / 0 / 0

Регистрация: 21.11.2016

Сообщений: 37

02.07.2010, 18:49

3

А нельзя ли поподробнее….
Куда это писать?

Может не сложно пример приложить?

Добавлено через 27 секунд
А нельзя ли поподробнее….
Куда это писать?

Может не сложно пример приложить?



0



Понравилась статья? Поделить с друзьями:
  • Как запретить ссылки в excel
  • Как запретить сохранение файла в excel
  • Как запретить редактировать ячейки excel
  • Как запретить редактировать столбец в excel
  • Как запретить редактировать документ word