SaveAs внутри BeforeSave (Excel, VBA)

Я хочу запрограммировать Excel для создания резервной копии моего файла перед его сохранением.

Но каждый раз, когда я пытаюсь его использовать, Excel падает.

Пожалуйста, объясните мне, почему это происходит, даже если я вставляю Application.EnableEvents = False, чтобы предотвратить бесконечный цикл?

Код, который я использую, приведен ниже:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Application.EnableEvents = False
    ActiveWorkbook.SaveAs Filename:=ActiveWorkbook.Path & "\" & "BackUp_" & Date & "_" & ActiveWorkbook.Name, FileFormat:=52
    Application.EnableEvents = True
End Sub

Заранее спасибо за помощь!


person Oleksandr Titorchuk    schedule 22.11.2017    source источник
comment
Я не уверен, содержит ли Date специальные символы, которые не могут содержаться в имени файла.   -  person    schedule 22.11.2017
comment
вам не хватает запятой , перед FileFormat:=52 ?   -  person Shai Rado    schedule 22.11.2017
comment
@ Дэвид - Дата не вызывает проблем. Excel вылетает даже без него.   -  person Oleksandr Titorchuk    schedule 22.11.2017
comment
@ Шай, спасибо за комментарий, но проблема снова не устранена.   -  person Oleksandr Titorchuk    schedule 22.11.2017
comment
Открываете книгу на диске или создаете новый файл Excel из меню «Пуск» или открываете его из электронной почты или другого источника, кроме вашего диска? Если файл еще не находится на диске, Activeworkbook.path ничего не возвращает.   -  person PankajKushwaha    schedule 22.11.2017
comment
@ Pankaj, файл у меня на диске.   -  person Oleksandr Titorchuk    schedule 22.11.2017


Ответы (1)


Изменить: я нашел причину. SaveAs закроет исходную книгу без сохранения и автоматически откроет новую. Поэтому Excel не может выполнить сценарий сохранения источника.

Вместо этого использование SaveCopyAs может создать копию в фоновом режиме, поэтому исходный файл все еще жив в вашем окне.

Попробуй это:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    ActiveWorkbook.SaveCopyAs Filename:=ActiveWorkbook.Path & "\" & "BackUp_" & Format(Date, "YYYYMMDD") & "_" & ActiveWorkbook.Name
End Sub

Примечание. Прямой вызов Date может быть похож на 2017/11/22, который содержит /, который является недопустимым символом, использование функции Format может предотвратить ошибку.

person newacc2240    schedule 22.11.2017
comment
Спасибо за помощь! Думаю воспользуюсь вашим решением) - person Oleksandr Titorchuk; 22.11.2017