Как удалить книгу из самой себя

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


Удаление книги после определенной даты средствами VBA
Итак, если у вас есть "важная" книга Excel и её необходимо удалить(самоуничтожить) по прошествии определенной даты (в примере ниже это 30.01.2014):

Sub DelThisWorkbook()
    If Date > #1/30/2014# Then
        Application.DisplayAlerts = False
        ThisWorkbook.ChangeFileAccess xlReadOnly
        Kill ThisWorkbook.FullName
        Application.DisplayAlerts = True
        'ThisWorkbook.Close 0 'если необходимо сразу же закрыть книгу(рекомендуется)
    End If
End Sub

Необходимо будет лишь вызывать данную процедуру в нужный момент. Каждый решит для себя сам когда это сделать. На открытие книги или перед выполнением какого-либо кода. Необходимо будет только в нужном месте кода сделать вызов:

Call DelThisWorkbook

Обращаю особое внимание на формат даты: #1/30/2014#. Это формат даты в американском стандарте: Месяц/День/Год. Именно в таком порядке и заключенная в решетки. Решетки дают понять Excel, что это будет дата. Указание даты именно в таком виде делает код универсальным для любой локализации ОС и Excel.

Если необходимо проверять дату при каждом открытии книги и при наступлении этой даты удалять книгу - то в модуль книги надо будет поместить такой код:

Private Sub Workbook_Open()
    DelThisWorkbook
End Sub

Код процедуры DelThisWorkbook приведен выше и он должен уже присутствовать в книге либо в модуле книги, либо в стандартном модуле(Insert -Module).



Удаление книги сразу после "прочтения"
Если же необходимо открыть книгу на один раз и сразу после закрытия удалить, то пригодится следующий код:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Me.ChangeFileAccess xlReadOnly
    Kill Me.FullName
End Sub

Код необходимо поместить в модуль книги.

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



Запрет редактирования книги после определенной даты средствами VBA
Подобный подход удобен в случаях, когда необходимо создать файл шаблона, который потом выкладывается в общую папку для заполнения другими людьми. Например, есть шаблона заявки, который лежит в сетевой папке и который может заполнить любой сотрудник для создания различных заявок(на ремонт ПК, установку ПО, чистку кулера, доставку кофе и т.д.). Как только сотрудник заполнит все нужные поля и сохранит заявку - даже если он ошибется и нажмет простое сохранение будет выдано сообщение о необходимости Сохранить как - сохранить книгу под другим именем. Т.е. выбора у него не будет. Шаблон таким образом всегда остается незаполненным.
С помощью VBA можно установить запрет редактирования книги после наступления определенной даты. Для этого в приведенных выше кодах надо просто убрать строку, которая начинается на Kill. Эта строка отвечает за удаление файла и она будет лишней. Если изменить первый код, то получится так:

Sub DelThisWorkbook()
    If Date > #1/30/2014# Then
        Application.DisplayAlerts = False
        ThisWorkbook.ChangeFileAccess xlReadOnly
        Application.DisplayAlerts = True
        'ThisWorkbook.Close 0 'если необходимо сразу же закрыть книгу(рекомендуется)
    End If
End Sub

Строка .ChangeFileAccess xlReadOnly изменяет доступ к файлу только для чтения. Это значит, что если в книгу будут внесены хоть какие-то изменения, то её нельзя будет сохранить и перезаписать. Можно будет только сохранить её копию(т.е. Файл(File) -Сохранить как(Save As)).



Запрет редактирования книги без использования макросов
Сделать книгу доступной только для чтения можно и без макросов(т.е. сделать из неё неизменяемый шаблон). Самый универсальный способ - это после окончательного создания файла нажать Сохранить как(Save As) -внизу диалогового окна раскрыть список Сервис(Tools) -Общие параметры(General options). В появившемся окне поставить галочку напротив пункта "Рекомендовать доступ только для чтения(Read-only recommended)". Там же можно установить пароли:
Сохранить только для чтения

  • Пароль для открытия(Password to open): в этом случае книгу нельзя будет открыть и даже просматривать, без указания пароля
  • Пароль для изменения(Password to modify): в этом случае при открытии книги будет запрошен пароль:
    Пароль при открытии
    Если его ввести - то будет доступна кнопка Ок и книга откроется как обычно, без ограничений. Если не указать пароль - то будет доступна только отмена открытия книги и кнопка Только для чтения - тогда книга будет открыта с доступом только для чтения.
    Пароль лучше устанавливать всегда. Почему? Потому что зная пароль можно открыть книгу не в режиме "только для чтения", а в обычном. Т.е. если необходимо будет внести в исходный шаблон какие-либо изменения - открываем книгу и вводим пароль. Вносим нужные изменения и сохраняем. Т.е. зная пароль можно внести изменения в исходную книгу, а без пароля - только в копию.

Кстати, такую защиту можно установить на любую книгу и кодом. В примере ниже пароль на редактирование устанавливается для активной в момент выполнения кода книги(назначается пароль "1"(без кавычек)):

Sub SetWritePassword()
    ActiveWorkbook.WritePassword = "1"
End Sub

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

Так же см.:
Каждому пользователю свой лист/диапазон
Как удалить папку или все файлы из папки через VBA
Как удалить макросы в книге?
Как удалить строки по условию?

Loading

Один комментарий

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.