Excel での共同編集について
Excel での共同編集のしくみと、共同編集との円滑な統合のためにアドインまたはマクロを調整する必要がある方法について説明します。
コオーサリングは、すべての Excel Online ユーザーが使用できます。 この機能は、Excel for Windows Desktop でも使用できますが、Office 365のお客様にのみ使用できます。
共同編集の概要
コオーサリングを使用すると、クラウドでホストされているブック (OneDrive、OneDrive for Business、または SharePoint Online) を他のユーザーと同時に編集できます。 保存するたびに、その時点でブックを編集しているすべてのユーザーが変更を確認できます。 自動保存を有効にすると、ブックに対するすべてのユーザーの変更をリアルタイムで確認できます。 他のユーザーが変更を表示する準備ができていない場合は、変更を共有して他のユーザーの変更を受け取る準備ができるまで、自動保存をオフにすることができます。
共同編集の原則
Excel では、ブックに対して行われた変更 (ユーザーまたはコードによって) が自動的に同期されます。 たとえば、ユーザーのインスタンスでコードが実行され、セルの内容が次のように変更されるとします。 Range("A1").Value = "myNewValue"
Excel では、この変更を他の共同編集者に送信する必要があります。
次に、別のユーザーのインスタンスで実行されているコードがあり、そのセルの内容を次のように検査するとします。 MsgBox Range("A1").Value
2 番目のユーザーには、最初のユーザーによって設定された値 "myNewValue"
が表示されます。
ただし、Excel では、ブックコンテンツの外部でコードによって作成された変数は自動的に同期 されません 。 たとえば、コードがセルから値を読み取り、変数に読み込んだとします。
Dim myVariable
myVariable = Range("A1").Value
Excel は、 の myVariable
値を自動的に更新しません。つまり myVariable
、他の共同編集者の Excel インスタンスで実行されているコードによって作成されたのと同じ名前の変数と同期されません。
共同編集環境にソリューションを適応させる必要がある場合がある状況
既存のアドインとマクロは Excel に依存してブックに加えた変更を共同編集者にシームレスに送信できるため、通常、変更や更新を行わずにこの新しい環境でコードを使用できます。 ただし、2 つのケースでは、共同編集設定で円滑に動作させる場合は、コードの調整が必要になる場合があります。
BeforeRemoteChange イベントと AfterRemoteChange イベントが追加され、該当する場合にリモート変更を管理できます。
ブック コンテンツの外部で内部メモリ内の状態を持つアドイン
ユーザーが Excel ブック内のデータに基づいてカスタム グラフを作成できるようにするアドインを想像してみてください。 このアドインは、ユーザーのグラフのデータをブックの非表示シートに読み込みます。 ユーザーがカスタム グラフを含むファイルを開くと、アドインは非表示シートのデータを読み取り、グラフをメモリに読み込みます。 ユーザーがグラフを編集すると、このメモリ内構造が更新され、各保存の前にファイルに書き直されます。 このアドインでは、非表示のシートを読み取ってメモリに読み込む必要があるのは、ファイルを開くときだけであると想定しています。
コオーサリング別の可能性が開きます。非表示のシートは、同じアドインを同時に実行している別のユーザーによって変更できます。 この場合、ユーザーが表示しているグラフが同期しなくなる可能性があります。例えば:
- ユーザー A がファイルを開き、既存のカスタム グラフの表示を開始するとします。
- この操作を行っている間、ユーザー B は同じファイルを開き、カスタム グラフの変更を開始します (たとえば、グラフの種類を変更します)。
- その変更は、ユーザー B のコンピューター上のアドインによってシートに保存されますが、ユーザー A はファイルを再読み込みするまで変更が表示されません。
回避策
可能な限り、ブック データを変更できる時期に関する前提を立てないようにしてください。 この場合は、 AfterRemoteChange イベントに反応するようにアドインを変更し、非表示のシートの値を確認して、ユーザー A がユーザー B が行ったグラフの変更を表示できるように、アドインで再度読み取る必要があるかどうかを確認できます。 アドインは、グラフ範囲が変更されるたびに実行することを目的としています。 これは読み込み時に発生し、リモート変更で発生する可能性があります。 そのため、 AfterRemoteChange のロジックでアドインを再実行する必要があります。
イベントを利用するアドイン
アドインまたはマクロは、既に保存イベントまたは変更イベントをサブスクライブしている可能性があります。 共同編集の導入により、次の問題が発生する可能性があります。
イベントを保存する
コードで BeforeSave や AfterSave などの保存イベントを使用すると、問題が発生する可能性があります。 詳細については、「 保存イベントと自動保存に関する潜在的な問題」を参照してください。
イベントの変更
既定では、コードは通常、リモート ユーザーからの変更を処理する必要はありません。 ただし、リモートの変更を処理すると問題が発生する場合があります。 ここでは、2 つのサンプル シナリオについて説明します。
サンプル シナリオ: データ検証
ブックで特定の範囲が編集されると、変更イベントがトリガーされます。 その後、アドイン コードによって変更が検証され、チェックが失敗した場合は、ポップアップ ウィンドウでユーザーに通知されます。 ただし、そのブックで共同作業を行っているすべてのリモート ユーザーに、自分の変更とは無関係の検証エラーが通知されると、エクスペリエンスが低下する可能性があります。
例
この例では、さまざまなデザートを販売した量を表示するグラフが作成されました。 コストも販売数も負の値にすることはできません。そのため、ユーザーにメッセージを表示する検証チェックがあります。 無効な値がリモート ユーザーにプッシュされた場合は、検証メッセージを表示しないでください。
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 のサポートおよびフィードバックを参照してください。