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-ы Книга сохраняет себя под другим именем в определенной папке и т.д., уже после переименования мне нужно внести макросом в "ЭтаКнига" указанный выше код, чтоб исключить вариант, что я забыл удалить новосозданный файл. Спасибо.
Пропишите код заранее, в коде предусмотрите проверку имени. Тем более что во втором коде достаточно добавить одну строку. Это проще чем доверять глобально доступ к проекту и изменять кодом его.
Если как обычный макрос выполнить 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
Ну и что его должно заставить выполниться, и по какому событию? На открытие, деактивацию/активацию, закрытие? Где это указано? Кому это понятно? P.S. Не интересовались, что есть такое ThisWorkbook.FullName?
Novichok55, вот тут сказано что, это типа "путь" + "имя с расширением". То есть, по идее, тоже самое, что ThisWorkbook.Path & "\" & ThisWorkbook.Name (не пробовал)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
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", ноне сработало, не везет мне сегодня с моим методом тыка
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: .......
закрывает книгу удаляя её (если раз в день то можно стерпеть).
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 написал: RAN создает рядом с исходным_readOnly файл с указанным именем, но не удаляет его
Я вообще перестал что-либо понимать. Если создать файл, и сразу его удалить, то зачем его создавать? А ежели даже и создать, то вполне достаточно просто закрыть без сохранения. Мой код создает из шаблона файл, который самоудаляется при его закрытии.
RAN ситуация следующая. Есть исходный файл (пустой в плане информации), в нем листы, некоторые далеко не пустые, уже со вставленными, где нужно, формулами, с кучей макросов. Открывается эта Книга, в первый лист вгружается информация из таблиц других файлов на первый лист этой книги, после чего вгруженное запуском целой цепочки макросов перемалывается "приводясь" к нужному мне формату подачи информации. Вся эта цепочка такая запутанная, что для повторения процедуры лучше закрыть Книгу с тем, что получилось и, открыв исходник (зажатый readOnly), проделать всё заново. Один из моментов этой цепочки в придачу требует именно сохранения данных, что сейчас в книге, поэтому в цепочку входит и момент когда файл сохраняется с другим именем в указанное место (именно он и является одноразового использования файлом который я не хочу как-нибудь забыть удалить).
Т.е. в исходном файле должна быть прописана формула самоубийства, но сработать получается она должна на том одноразовом файле, когда я его закрою, распечатав то что в нем получилось.
Теперь я понял принцип вашего макроса, получается он не совсем подходит, т.к. нужно закрыть файл Исходник_readOnly и открыть тот другой файл. С другой стороны можно с отключенными макросами его прописать в исходник, в процессе "цепочьки" имя файла сменится (+ новый файл не readOnly) и я как бы закрывая уже другой файл смогу и ваш макрос использовать, когда файл не readOnly макрос работает просто убивая без сохранения чего-либо. Жаль, что тоже оставляет открытым пустое окно Excel
Мало чего понял, но видимо, перед сохранением той копии на удаление, надо в файле какую-то метку ставить(либо в свойствах документа, либо в именованном диапазоне, либо в ячейках). И перед закрытием книги проверять, есть ли эта метка. Если есть - книгу удаляем. Если нет метки - не удаляем.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Дмитрий Щербаков уже как бы подсказали, всё что нужно есть и понятно как сделать, чтоб исходник в любом случае был в безопасности. Остался последний штрих, только самый первый код
Код
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. Вариант с
Novichok55 написал: при закрытии и книгу удаляет и полностью закрывает окно Экселя
да ничего он не закрывает. Он так же просто закрывает книгу и все. Если в этот момент открыта еще хоть одна книга - Excel останется открытым. Вы бы хоть чуть-чуть начали уже синтаксис изучать не методом тыка, а через чтение литературы. Чтобы Excel закрывался, надо добавить в конце такую строку:
Код
If Application.workbooks.count <1 then Application.quit
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
приведенный вами код не помогло, а вот вместо самое то оказалось
Более универсальный вариант для одного из кодов (книга которую НЕ нужно удалять может перемещаться по разным дискам/папкам)
Код
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