[1] "Лишняя" выдача сообщения сохранения файла Exc

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
Avsha
Сообщения: 665
Зарегистрирован: 08 сен 2005, 13:47
Откуда: KZ

У меня в файле Excel ячейки имеют формулы использующие функцию =ТДАТА() и условное форматирование.
Соответственно когда я открываю этот файл, формулы изменяют содержимое и формат ячеек,
но затем ничего другого не делая, я закрываю файл и Excel выдает сообщение о том, что файл был изменен и
не сохранен.
Можно ли отменить выдачу это сообщения для этого конкретного файла-xls?
Avsha
Сообщения: 665
Зарегистрирован: 08 сен 2005, 13:47
Откуда: KZ

Запрос на сохранение происходит из-за того, что:

1. Функция =ТДАТА() меняет значение ячейкам.
2. При изменении ячейки, свойство ЭтаКнига.Saved переходит в "False", т.е. книга принимает значение, что она не сохранена в настоящий момент
3. Внутренний механизм Excel при закрытии несохраненной книги (или всего приложения Excel) смотрит на свойство ЭтаКнига.Saved, и если оно "False", выдает сообщение

Пути устранения:
1. Перед закрытием рабочей книги установить признак ЭтаКнига.Saved = "True"
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Me.Saved = True
End Sub
2. На листе рабочей книги разместить кнопку, которая будет закрывать текущую книгу без подтверждения на сохранение, даже если ЭтаКнига.Saved = "False"
Private Sub CommandButton1_Click()
Application.ActiveWorkbook.Close False
End Sub
Вариант не работает при закрытии рабочей книги (приложения Excel) крестиком в правом углу :(

3.На листе рабочей книги разместить кнопку, которая будет закрывать полностью приложение Excel, при этом мы подавляем выдачу сообщений на сохранение внутреннего механизма Excel.
Private Sub CommandButton2_Click()
Application.DisplayAlerts = False
Application.Quit
End Sub
Вариант не выдает сообщения для всех книг, что тоже нехорошо, хотя в некоторых случаях применим.

Вывод: вариант 1 наиболее приемлим.

Остался вопрос, можно ли ловить событие для закрытия всего приложения Excel и где?
Тогда можно было пробежаться по всем открытым книгам и для тех книг, у которых заранее установленный условный признак "не сохранять при закрытии" равен True, выполнять закрытие без сохранения (Application.ActiveWorkbook.Close False).
Avsha
Сообщения: 665
Зарегистрирован: 08 сен 2005, 13:47
Откуда: KZ

Все накопал окончательное решение:

1.Создаем книгу Add_In_CloseApp.xls
2.Создаем модуль класса "Class_CloseApp" с кодом, для того чтобы ловить события закрытия книг и всего приложения Excel. Оказывается событие WorkbookBeforeClose используется не только для рабочих книг, но и для объекта Application, про это достаточно внятно написано в справке с примером (Using Events with the Application Object).
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
3. Пишем код в отсеке программ объекта ЭтаКнига, в котором задействуем модуль класса Class_CloseApp:
Dim X As New Class_CloseApp

Private Sub Workbook_Open()
Set X.App = Application
End Sub
4. Теперь сохраняем полученную книгу как надстройку Add_In_CloseApp.xla и подключаем ее в Excel.

Осталось в тех книгах, в которых нет необходимости сохранения при выходе в ячейку A1 на первом листе вбить "AlwaysSaved" - что является признаком несохранения при выходе.
Конечно можно найти другой признак, но мне пока удалось найти только этот.
Все это дело оформляется в надстройке, чтобы не лепить скрипты в каждой рабочей книге, и не вылетало сообщение о наличии макросов,
и надстройку при случае можно легко включить/отключить у каждого пользователя.
Ответить