Страницы: 1
RSS
Самоудаление книги
 
Здравствуйте.
Отличная статья https://www.excel-vba.ru/chto-umeet-excel/kak-udalit-knigu-iz-samoj-sebya/ код есть.
Но не могу найти как неким макросом добавить например этот код
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean)    
Me.ChangeFileAccess xlReadOnly    
Kill Me.FullName
End Sub
или ещё лучше
Код
Private Sub Kill_ThisWorkbook()
    iFullName$ = ThisWorkbook.FullName
    Application.DisplayAlerts = False
    ThisWorkbook.ChangeFileAccess Mode:=xlReadOnly
    SetAttr iFullName$, vbNormal: Kill iFullName$
    ThisWorkbook.Close saveChanges:=False
End Sub
в модуль "Эта книга".
У меня ситуация следующая. Есть исходная Книга (ReadOnly), с пустыми листами, напичканная макросами под определенную задачу. В процессе выполнения этой всей цепочки неким макросом в котором прописаны call-ы Книга сохраняет себя под другим именем в определенной папке и т.д., уже после переименования мне нужно внести макросом в "ЭтаКнига" указанный выше код, чтоб исключить вариант, что я забыл удалить новосозданный файл.
Спасибо.
Изменено: Novichok55 - 18.05.2018 21:58:50
 
Пропишите код заранее, в коде предусмотрите проверку имени. Тем более что во втором коде достаточно добавить одну строку.
Это проще чем доверять глобально доступ к проекту и изменять кодом его.
 
Спасибо. Действительно, у сохраняемого файла одно и тоже имя :) Щяс попробую найти как приписать имя для Книги.
 
Так во втором коде добавьте
Код
if iFullName$ = "известное полное имя исходной книги" then exit sub

Только не забудьте - если книгу куда-нибудь перенесёте, то хана... Но бекап - наше всё.
 
Опять морочу голову, второй код почему-то не удаляет ничего, даже в исходном своем виде.
Первый железно.
 
Здесь второй код срабатывал https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=84372
:( не понятно...
 
У меня второй код срабатывает, даже из модуля книги.
 
Если как обычный макрос выполнить 2й код, то да, самоудаляется, правда Excel пустой остается висеть.
Но именно как код в "Эта книга" выполняться при закрытии экселя не хочет самостоятельно. Первый же не выделывается и срабатывает из модуля "ЭтаКнига" :(
 
Цитата
Novichok55 написал:
Но именно как код в "Эта книга" выполняться при закрытии экселя не хочет самостоятельно
А как Вы его туда прописали? Как есть, наверное? А надо через событийную процедуру Before_Close. Приведите полностью код из ЭтаКнига, как он выглядит у Вас - тогда сразу и причину выявим.  
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
В исходном виде прописывал
Код
Private Sub Kill_ThisWorkbook()    
iFullName$ = ThisWorkbook.FullName    
Application.DisplayAlerts = False    
ThisWorkbook.ChangeFileAccess Mode:=xlReadOnly    
SetAttr iFullName$, vbNormal: Kill iFullName$    
ThisWorkbook.Close saveChanges:=False
End Sub
пробовал и с привязкой к проверке на имя
Код
Private Sub Kill_ThisWorkbook()    
iFullName$ = ThisWorkbook.FullName    
if iFullName$ = "Kniga.xlsm" then exit sub    
Application.DisplayAlerts = False    
ThisWorkbook.ChangeFileAccess Mode:=xlReadOnly    
SetAttr iFullName$, vbNormal: Kill iFullName$    
ThisWorkbook.Close saveChanges:=False
End Sub
Alt + F11 вношу в "ЭтаКнига" и сохраняю.
Изменено: Novichok55 - 19.05.2018 12:00:49
 
Ну и что его должно заставить выполниться, и по какому событию? На открытие, деактивацию/активацию, закрытие? Где это указано? Кому это понятно?
P.S. Не интересовались, что есть такое ThisWorkbook.FullName?
Изменено: Hugo - 19.05.2018 12:09:01
 
Код
Private Sub ThisWorkbook_BeforeClose(Cancel As Boolean)
    iFullName$ = ThisWorkbook.FullName
    Application.DisplayAlerts = False
    ThisWorkbook.ChangeFileAccess Mode:=xlReadOnly
    SetAttr iFullName$, vbNormal: Kill iFullName$
    ThisWorkbook.Close saveChanges:=False
End Sub
тоже не срабатывает :(
Не интересовался конечно же, что такое ThisWorkbook.FullName...
 
Цитата
Novichok55 написал:
Не интересовался конечно же
- ну и зря...
А событийного такого макрос нет, есть Private Sub Workbook_BeforeClose(Cancel As Boolean)
 
Novichok55, вот тут сказано что, это типа "путь" + "имя с расширением". То есть, по идее, тоже самое, что ThisWorkbook.Path & "\" & ThisWorkbook.Name (не пробовал)
Изменено: Jack Famous - 19.05.2018 12:39:36
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Novichok55, не нужно ВЫДУМЫВАТЬ название событийных процедур - их нельзя менять. Выбирайте существующие из КомбоБокса.
 
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    If Me.ReadOnly Then
        Me.SaveAs Me.Path & "\" & "11111111.xlsm"
    Else
        Me.Saved = True
        Me.ChangeFileAccess Mode:=xlReadOnly
        Kill Me.FullName
        Me.Close
    End If
End Sub
 
RAN спасибо, работает. Но как и первый код из первого сообщения, только ещё и не закрывает сам Excel. Не понятно как его сохранить в исходной книге (которую не нужно удалять), чтоб её не удалить при этом. Конечно попробовал постаить её имя на место "111111.xlsm", ноне сработало, не везет мне сегодня с моим методом тыка  :cry:
Изменено: Novichok55 - 19.05.2018 13:06:22
 
Ну так выясните ещё где-нибудь
Цитата
Novichok55 написал:
что такое ThisWorkbook.FullName
, если сообщения темы не помогают.
 
Цитата
Novichok55 написал:
Не понятно как его сохранить
А с отключенными макросами файл открыть слабо?
 
Hugo на данный момент по вашим подсказкам имею код
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    iFullName$ = ThisWorkbook.FullName
    If iFullName$ = "E:\Kniga.xlsm" Then Exit Sub
    Application.DisplayAlerts = False
    ThisWorkbook.ChangeFileAccess Mode:=xlReadOnly
    SetAttr iFullName$, vbNormal: Kill iFullName$
    ThisWorkbook.Close saveChanges:=False
End Sub
пока нет вариантов, в принципе можно пользоваться, оминает E:\Kniga.xlsm и пройдя через Debug (ругается на
Код
SetAttr iFullName$, vbNormal: .......
закрывает книгу удаляя её (если раз в день :) то можно стерпеть).

RAN спасибо, сейчас попробую.
 
Вариант без ошибок
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    On Error Resume Next
    Application.DisplayAlerts = False
    filepath$ = ThisWorkbook.FullName
    If filepath$ = "E:\Kniga.xlsm" Then Exit Sub
    ThisWorkbook.ChangeFileAccess xlReadOnly
    SetAttr filepath$, vbNormal
    Kill filepath$
    ThisWorkbook.Close False
End Sub
но не закрывается окно Excel как в самом первом коде первого сообщения. Это реально побороть?

RAN создает рядом с исходным_readOnly файл с указанным именем, но не удаляет его
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    If Me.ReadOnly Then
        Me.SaveAs Me.Path & "\" & "Kniga.xlsm"
    Else
        Me.Saved = True
        Me.ChangeFileAccess Mode:=xlReadOnly
        Kill Me.FullName
        Me.Close
    End If
End Sub
Изменено: Novichok55 - 19.05.2018 15:37:51
 
Цитата
Novichok55 написал:
RAN создает рядом с исходным_readOnly файл с указанным именем, но не удаляет его
Я вообще перестал что-либо понимать.
Если создать файл, и сразу его удалить, то зачем его создавать? А ежели даже и создать, то вполне достаточно просто закрыть без сохранения.
Мой код создает из шаблона файл, который самоудаляется при его закрытии.
 
RAN ситуация следующая. Есть исходный файл (пустой в плане информации), в нем листы, некоторые далеко не пустые, уже со вставленными, где нужно, формулами, с кучей макросов.
Открывается эта Книга, в первый лист вгружается информация из таблиц других файлов на первый лист этой книги, после чего вгруженное запуском целой цепочки макросов перемалывается "приводясь" к нужному мне формату подачи информации. Вся эта цепочка такая запутанная, что для повторения процедуры лучше закрыть Книгу с тем, что получилось и, открыв исходник (зажатый readOnly), проделать всё заново.
Один из моментов этой цепочки в придачу требует именно сохранения данных, что сейчас в книге, поэтому в цепочку входит и момент когда файл сохраняется с другим именем в указанное место (именно он и является одноразового использования файлом который я не хочу как-нибудь забыть удалить).

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

Теперь я понял принцип вашего макроса, получается он не совсем подходит, т.к. нужно закрыть файл Исходник_readOnly и открыть тот другой файл.
С другой стороны можно с отключенными макросами его прописать в исходник, в процессе "цепочьки" имя файла сменится (+ новый файл не readOnly) и я как бы закрывая уже другой файл смогу и ваш макрос использовать, когда файл не readOnly макрос работает просто убивая без сохранения чего-либо. Жаль, что тоже оставляет открытым пустое окно Excel :(
Изменено: Novichok55 - 19.05.2018 19:39:24
 
Мало чего понял, но видимо, перед сохранением той копии на удаление, надо в файле какую-то метку ставить(либо в свойствах документа, либо в именованном диапазоне, либо в ячейках). И перед закрытием книги проверять, есть ли эта метка. Если есть - книгу удаляем. Если нет метки - не удаляем.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Или наоборот: при сохранении ставим метку, а при открытии проверяем: если метка есть - Kill. ))
 
Дмитрий Щербаков уже как бы подсказали, всё что нужно есть и понятно как сделать, чтоб исходник в любом случае был в безопасности.
Остался последний штрих, только самый первый код
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean)    
Me.ChangeFileAccess xlReadOnly    
Kill Me.FullName
End Sub
при закрытии и книгу удаляет и полностью закрывает окно Экселя.
А эти два
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean)    
On Error Resume Next    
Application.DisplayAlerts = False    
filepath$ = ThisWorkbook.FullName    
If filepath$ = "E:\Kniga.xlsm" Then Exit Sub    
ThisWorkbook.ChangeFileAccess xlReadOnly    
SetAttr filepath$, vbNormal    
Kill filepath$    
ThisWorkbook.Close False
End Sub
или
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean)    
If Me.ReadOnly Then        
Me.SaveAs Me.Path & "\" & "Kniga.xlsm"    
Else        
Me.Saved = True        
Me.ChangeFileAccess Mode:=xlReadOnly        
Kill Me.FullName        
Me.Close    
End If
End Sub
не могут закрыть пустое окно Экселя. Мелочь, но если можно побороть, то не плохо бы.

В прнципе аккуратно через отключение макросов можно и первый код вписать в исходник, затем его сделав readOnly и включив макросы. На файл readOnly он не действует, но очень он уж опасный, стоит только зазеваться и снять например для изменения исходника галку ReadOnly. Вариант с
Код
If filepath$ = "E:\Kniga.xlsm" Then Exit Sub 
куда более щадящий .
Изменено: Novichok55 - 19.05.2018 20:08:51
 
Цитата
Novichok55 написал:
при закрытии и книгу удаляет и полностью закрывает окно Экселя
да ничего он не закрывает. Он так же просто закрывает книгу и все. Если в этот момент открыта еще хоть одна книга - Excel останется открытым. Вы бы хоть чуть-чуть начали уже синтаксис изучать не методом тыка, а через чтение литературы.
Чтобы Excel закрывался, надо добавить в конце такую строку:
Код
If Application.workbooks.count <1 then Application.quit
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Спасибо. Поставив под
Код
ThisWorkbook.Close False
приведенный вами код не помогло, а вот вместо самое то оказалось :)

Более универсальный вариант для одного из кодов (книга которую НЕ нужно удалять может перемещаться по разным дискам/папкам)
Код
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    On Error Resume Next
    Application.DisplayAlerts = False
    filePath$ = ThisWorkbook.FullName
    If filePath$ = (Path & "\" & "Kniga.xlsm") Then Exit Sub
    ThisWorkbook.ChangeFileAccess xlReadOnly
    SetAttr filePath$, vbNormal
    Kill filePath$    
    If Application.workbooks.count <1 then Application.quit
End Sub
Изменено: Novichok55 - 19.05.2018 22:25:00
Страницы: 1
Наверх