Несмотря на несколько бредовое название статьи, данный вопрос поднимается с завидным постоянством. Кто-то таким образом хочет защитить свое творение от использования после определенной даты; кто-то слишком мнителен; а кто-то хочет знать просто из интереса: вдруг пригодится?
Несмотря на всю абсурдность вопроса многие считают, что это нереально средствами только 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

Необходимо будет лишь вызывать данную процедуру в нужный момент. Каждый решит для себя сам когда это сделать. На открытие книги или перед выполнением основного кода.
Обращаю особое внимание на формат даты: #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

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

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


Еще подобный подход можно применять и не для безвозвратного удаления книги, а просто для запрета её редактирования после определенной даты. Для этого в приведенных выше кодах надо просто убрать строку, которая начинается на 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
Как удалить макросы в книге?
Как удалить строки по условию?

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

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

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