Поделиться через


Сведения о совместном редактировании в Excel

Узнайте, как работает совместное редактирование в Excel и как может потребоваться настроить надстройку или макрос для плавной интеграции с совместным редактированием.

Совместная работа доступна всем пользователям Excel Online. Эта функция также доступна в Excel для Windows Desktop, но только для Office 365 клиентов.

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

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

Принципы совместного редактирования

Excel автоматически синхронизирует изменения, внесенные в книгу (как пользователем, так и кодом). Например, предположим, что код выполняется в экземпляре пользователя и изменяет содержимое ячейки следующим образом: Range("A1").Value = "myNewValue". Excel позаботится об отправке этого изменения другим соавторам.

Теперь предположим, что в экземпляре другого пользователя выполняется код, который проверяет содержимое этой ячейки следующим образом: MsgBox Range("A1").Value. Второй пользователь увидит значение "myNewValue" , заданное первым пользователем.

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

Dim myVariable
myVariable = Range("A1").Value

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

Ситуации, когда может потребоваться адаптировать решение к среде совместного редактирования

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

События BeforeRemoteChange и AfterRemoteChange были добавлены, чтобы вы могли управлять удаленными изменениями, если это применимо.

Надстройки, имеющие внутреннее состояние в памяти за пределами содержимого книги

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

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

  • Предположим, пользователь А открывает файл и начинает просматривать существующую пользовательскую диаграмму.
  • Во время этого пользователь Б открывает тот же файл и начинает вносить изменения в настраиваемую диаграмму (например, изменяет тип диаграммы).
  • Это изменение будет сохранено на листе надстройкой на компьютере пользователя B, но пользователь А никогда не увидит изменения, пока не перезагрузит файл.

Обходной путь

Старайтесь, насколько это возможно, не делать предположений о том, когда можно изменить данные книги. В этом случае можно изменить надстройку, чтобы она реагировала на событие AfterRemoteChange , а затем проверить значения скрытого листа, чтобы узнать, нужно ли их снова прочитать надстройке, чтобы разрешить пользователю A просматривать изменения диаграммы, внесенные пользователем B. Надстройка предназначена для запуска при изменении диапазона диаграммы. Это происходит при загрузке и может произойти при удаленном изменении. Таким образом, ваша логика в AfterRemoteChange должна повторно запустить надстройку.

Надстройки, использующие события

Надстройка или макрос могут уже подписаться на сохранение или изменение событий. С появлением совместного редактирования у вас могут возникнуть проблемы с:

Сохранение событий

При использовании в коде событий сохранения, таких как BeforeSave и AfterSave, могут возникнуть проблемы. Дополнительные сведения см. в разделах Потенциальные проблемы с событиями сохранения и Автосохранение.

События изменения

По умолчанию код обычно не требует обработки изменений от удаленных пользователей. Однако в некоторых случаях обработка удаленных изменений может вызвать проблемы. Здесь рассматриваются два примера сценариев.

Пример сценария: проверка данных

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

Пример

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

Public Sub ValidateFigures()
    Dim rangeToValidate As Range
    Set rangeToValidate = ActiveWorkbook.Worksheets("Chart").Range("B2:C6")
    For Each cell In rangeToValidate.Cells
        If (cell.Value < 0) Then
            MsgBox ("Error: Value should not be negative. " & cell.Address)
        End If
    Next
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    ActiveWorkbook.Worksheets("Chart").ValidateFigures
End Sub

Поэтому в этом случае нет необходимости подписываться на событие BeforeRemoteChange или AfterRemoteChange .

Private Sub Workbook_AfterRemoteChange()
    ' Do not call validation from RemoteChange event
    'ActiveWorkbook.Worksheets("Chart").ValidateFigures
End Sub

Рис. 1. Пример диаграммы, представляющей продажи десерта

продажи десертов

Пример сценария: согласованность данных

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

Потенциальные проблемы с событиями изменений

Хотя обычно код обработчика событий не будет выполняться в ответ на изменения, внесенные удаленным пользователем, поведение по умолчанию , когда события изменений не запускаются, могут вызвать проблемы. Ниже приведены некоторые примеры проблем и способы их решения с помощью событий BeforeRemoteChange и AfterRemoteChange .

Пример сценария: визуализация данных

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

Пример

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

Public Sub UpdateMap()
    'Code that updates map
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    'Call subroutine that updates map
End Sub

Теперь используйте событие AfterRemoteChange , чтобы добавить код, который обновляет карту. Последующие изменения, отправленные удаленному пользователю, используются для обновления карты.

Private Sub Workbook_AfterRemoteChange()
    'Call subroutine that updates map
End Sub

Рис. 2. Пример карты Лондона с несколькими достопримечательностями

расположения лондона

Пример сценария: область задач навигации

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

См. также

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

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