У меня в файле Excel ячейки имеют формулы использующие функцию =ТДАТА() и условное форматирование.
Соответственно когда я открываю этот файл, формулы изменяют содержимое и формат ячеек,
но затем ничего другого не делая, я закрываю файл и Excel выдает сообщение о том, что файл был изменен и
не сохранен.
Можно ли отменить выдачу это сообщения для этого конкретного файла-xls?
[1] "Лишняя" выдача сообщения сохранения файла Exc
Модератор: Naeel Maqsudov
Запрос на сохранение происходит из-за того, что:
1. Функция =ТДАТА() меняет значение ячейкам.
2. При изменении ячейки, свойство ЭтаКнига.Saved переходит в "False", т.е. книга принимает значение, что она не сохранена в настоящий момент
3. Внутренний механизм Excel при закрытии несохраненной книги (или всего приложения Excel) смотрит на свойство ЭтаКнига.Saved, и если оно "False", выдает сообщение
Пути устранения:
1. Перед закрытием рабочей книги установить признак ЭтаКнига.Saved = "True"
3.На листе рабочей книги разместить кнопку, которая будет закрывать полностью приложение Excel, при этом мы подавляем выдачу сообщений на сохранение внутреннего механизма Excel.
Вывод: вариант 1 наиболее приемлим.
Остался вопрос, можно ли ловить событие для закрытия всего приложения Excel и где?
Тогда можно было пробежаться по всем открытым книгам и для тех книг, у которых заранее установленный условный признак "не сохранять при закрытии" равен True, выполнять закрытие без сохранения (Application.ActiveWorkbook.Close False).
1. Функция =ТДАТА() меняет значение ячейкам.
2. При изменении ячейки, свойство ЭтаКнига.Saved переходит в "False", т.е. книга принимает значение, что она не сохранена в настоящий момент
3. Внутренний механизм Excel при закрытии несохраненной книги (или всего приложения Excel) смотрит на свойство ЭтаКнига.Saved, и если оно "False", выдает сообщение
Пути устранения:
1. Перед закрытием рабочей книги установить признак ЭтаКнига.Saved = "True"
2. На листе рабочей книги разместить кнопку, которая будет закрывать текущую книгу без подтверждения на сохранение, даже если ЭтаКнига.Saved = "False"Private Sub Workbook_BeforeClose(Cancel As Boolean)
Me.Saved = True
End Sub
Вариант не работает при закрытии рабочей книги (приложения Excel) крестиком в правом углуPrivate Sub CommandButton1_Click()
Application.ActiveWorkbook.Close False
End Sub

3.На листе рабочей книги разместить кнопку, которая будет закрывать полностью приложение Excel, при этом мы подавляем выдачу сообщений на сохранение внутреннего механизма Excel.
Вариант не выдает сообщения для всех книг, что тоже нехорошо, хотя в некоторых случаях применим.Private Sub CommandButton2_Click()
Application.DisplayAlerts = False
Application.Quit
End Sub
Вывод: вариант 1 наиболее приемлим.
Остался вопрос, можно ли ловить событие для закрытия всего приложения Excel и где?
Тогда можно было пробежаться по всем открытым книгам и для тех книг, у которых заранее установленный условный признак "не сохранять при закрытии" равен True, выполнять закрытие без сохранения (Application.ActiveWorkbook.Close False).
Все накопал окончательное решение:
1.Создаем книгу Add_In_CloseApp.xls
2.Создаем модуль класса "Class_CloseApp" с кодом, для того чтобы ловить события закрытия книг и всего приложения Excel. Оказывается событие WorkbookBeforeClose используется не только для рабочих книг, но и для объекта Application, про это достаточно внятно написано в справке с примером (Using Events with the Application Object).
Осталось в тех книгах, в которых нет необходимости сохранения при выходе в ячейку A1 на первом листе вбить "AlwaysSaved" - что является признаком несохранения при выходе.
Конечно можно найти другой признак, но мне пока удалось найти только этот.
Все это дело оформляется в надстройке, чтобы не лепить скрипты в каждой рабочей книге, и не вылетало сообщение о наличии макросов,
и надстройку при случае можно легко включить/отключить у каждого пользователя.
1.Создаем книгу Add_In_CloseApp.xls
2.Создаем модуль класса "Class_CloseApp" с кодом, для того чтобы ловить события закрытия книг и всего приложения Excel. Оказывается событие WorkbookBeforeClose используется не только для рабочих книг, но и для объекта Application, про это достаточно внятно написано в справке с примером (Using Events with the Application Object).
3. Пишем код в отсеке программ объекта ЭтаКнига, в котором задействуем модуль класса Class_CloseApp:Public WithEvents App As Application
Private Sub App_WorkbookBeforeClose(ByVal Wb As Workbook, Cancel As Boolean)
On Error GoTo err
If Wb.Worksheets.Item(1).Cells(1, 1) = "AlwaysSaved" Then Wb.Saved = True
Exit Sub
err:
End Sub
4. Теперь сохраняем полученную книгу как надстройку Add_In_CloseApp.xla и подключаем ее в Excel.Dim X As New Class_CloseApp
Private Sub Workbook_Open()
Set X.App = Application
End Sub
Осталось в тех книгах, в которых нет необходимости сохранения при выходе в ячейку A1 на первом листе вбить "AlwaysSaved" - что является признаком несохранения при выходе.
Конечно можно найти другой признак, но мне пока удалось найти только этот.
Все это дело оформляется в надстройке, чтобы не лепить скрипты в каждой рабочей книге, и не вылетало сообщение о наличии макросов,
и надстройку при случае можно легко включить/отключить у каждого пользователя.