Как автосохранение влияет на надстройки и макросы

Сведения о работе функции автосохранения в Excel, PowerPoint и Word ее влиянии на надстройки или макросы.

Общие сведения об автосохранении

Если файл размещен в облаке (т. е. в OneDrive, OneDrive для бизнеса или SharePoint Online), автосохранение позволяет автоматически и постоянно сохранять изменения, вносимые пользователем. Если другим пользователям предоставлен общий доступ к файлу, внесенные ими изменения объединяются в этой версии файла пользователя. Если функция автосохранения отключена, сохранение необходимо выполнять вручную, чтобы сохранить в облаке внесенные пользователем изменения и обеспечить для него получение изменений, вносимых другими пользователями.

В настоящее время Excel, Word и PowerPoint предоставляют событие BeforeSave, позволяющее разработчику выполнять код после запуска действия сохранения пользователем, но до его осуществления. В Excel также доступно событие AfterSave, которое может выполнять код макроса или надстройки после завершения сохранения.

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

Как правило, этих проблем можно избежать, если пользователь отключит функцию автосохранения. Можно сделать это от имени пользователя с помощью свойства AutoSaveOn в Word, Excel и PowerPoint, если оно доступно (см. приведенный ниже пример). Можно также принять меры в качестве разработчика, чтобы устранить эти проблемы для обеспечения безошибочной работы надстроек и макросов даже при включенном автосохранении.

Пример

В этом примере отключается функция автосохранения и пользователь уведомляется о том, что книга не сохраняется автоматически.

Sub UseAutoSaveOn()
    ActiveWorkbook.AutoSaveOn = False
    MsgBox "This workbook is being saved automatically: " & ActiveWorkbook.AutoSaveOn
End Sub

Возможные проблемы с событиями сохранения и автосохранением

Может потребоваться решение одной или нескольких из указанных ниже проблем, связанных с взаимодействием между событиями сохранения и автосохранением:

  1. Код в событиях BeforeSave или AfterSave выполняется слишком долго
  2. Код в событиях сохранения вызывает модальное диалоговое окно
  3. Код в событиях сохранения очищает стек отмены (только в Excel)
  4. Код в событии AfterSave загрязняет книгу (только в Excel)
  5. Код в событии BeforeSave отменяет сохранение файла (устанавливая для аргумента Cancel значение True)

Проблема 1. Код в событиях BeforeSave или AfterSave выполняется слишком долго

Как правило, Word, Excel и PowerPoint не реагируют на действия пользователя при выполнении кода надстройки или макроса. Поэтому если код в обработчике событий BeforeSave или AfterSave выполняется слишком долго, это может значительно ухудшить впечатление от использования.

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

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

Пример сценария

Представьте себе надстройку, позволяющую пользователю создавать настраиваемые сопоставления на основе данных в книге Excel. Такая надстройка может содержать код BeforeSave, который сериализует любые сопоставления, созданные пользователем, и сохраняет их в части CustomXML книги. Завершение этого процесса может занять несколько секунд, и Excel может перестать отвечать на запросы во время его выполнения.

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

Если функция автосохранения включена, этот код BeforeSave запускается автоматически с определенной периодичностью, даже если пользователь находится посреди другого действия (например, вводит данные в ячейку), что может вызывать сильное раздражение.

Временное решение

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

Проблема 2. Код в событиях сохранения вызывает модальное диалоговое окно

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

Пример сценария

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

Временные решения

Рассмотрите возможность переноса кода, требующего отображения пользовательского интерфейса, в другие области приложения. Например, пользователь может нажать кнопку "Проверить", чтобы запустить процесс проверки, или можно запускать код проверки только в том случае, если пользователь пытается изменить существующие данные.

Если нужно запускать код проверки только при первом сохранении из нового документа (без запуска при последующих автосохранениях), рекомендуется проверка такого свойства, как Workbook.Path приложения Excel, перед отображением любого элемента пользовательского интерфейса во время событий BeforeSave или AfterSave. В приложении Excel свойство Workbook.Path должно быть пустым, если для книги еще не выбрано место сохранения.

Проблема 3. Код в событиях сохранения очищает стек отмены (только в Excel)

Как правило, при запуске определенных операторов VBA в Excel стек отмены очищается. Например, если изменяется значение ячейки с помощью запуска кода ActiveCell.Value = "myValue", стек отмены очищается. Если такой код имеется в событии BeforeSave или AfterSave для макроса или надстройки при включенной функции автосохранения, пользователь макроса или надстройки часто не сможет отменять обычные действия должным образом.

Пример сценария

Надстройка, которая может содержать код, выполняемый в ответ на событие BeforeSave, проверяющий документ и записывающий значения в таблицу "журнал" в книге. Если функция автосохранения включена, это будет приводить к периодическому очищению стека отмены, что может раздражать пользователей.

Временное решение

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

Проблема 4. Код в событии AfterSave загрязняет книгу (только в Excel)

Если функция автосохранения включена, события BeforeSave и AfterSave запускаются только в случае изменений в книге с момента их последнего запуска. Если код в событии AfterSave загрязняет книгу (т. е. создает дополнительные изменения), это может приводить к повторному запуску событий для одного и того же изменения и к созданию очереди событий для их бесконечного повторного запуска. Это может расходовать системные ресурсы и влиять на время работы аккумулятора.

Временное решение

Код, загрязняющий книгу в событии AfterSave, должен быть перемещен в событие BeforeSave или полностью другое расположение (см. раздел Проблема 3). На настоящий момент это решение не рекомендуется, даже без автосохранения, так как оставляет книгу в постоянном "грязном" состоянии, что приводит к появлению приглашения при закрытии, запрашивающего сохранение изменений у пользователя, даже если он не вносил дополнительных изменений. 

Проблема 5. Код в событии BeforeSave отменяет сохранение файла (устанавливая для аргумента Cancel значение True)

На сегодняшний день можно отменить сохранение в событии BeforeSave, установив для аргумента Cancel значение True:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) 
    Cancel = True
End Sub

Если функция автосохранения включена, приложение (т. е. Excel, Word или PowerPoint) запускает действия сохранения автоматически на постоянной основе, пока в файле остаются несохраненные изменения. После изменения файла, внесенного пользователем, приложение пытается сохранить его.

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

Пример сценария

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

Временное решение

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

См. также

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.