共用方式為


關於在 Excel 中共同撰寫

瞭解共同撰寫在 Excel 中的運作方式,以及您可能需要如何調整增益集或宏,以便順利地與共同撰寫整合。

共同撰寫可供所有 Excel Online 使用者使用。 這項功能也適用于 Windows 桌上出版 Excel,但僅適用于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 順暢地將它們對活頁簿所做的變更傳輸給共同作者,所以您通常可以在這個新環境中使用程式碼,而不需要進行任何變更或更新。 不過,在兩種情況下,如果您想要在共同撰寫設定中順暢地運作,您可能需要調整程式碼:

已新增 BeforeRemoteChangeAfterRemoteChange 事件,可讓您在適用的情況下管理遠端變更。

在活頁簿內容外部具有內部記憶體內部狀態的增益集

假設增益集可讓使用者根據 Excel 活頁簿中的資料建立自訂圖表。 此增益集會將使用者圖表的資料載入活頁簿中的隱藏工作表。 當使用者開啟包含自訂圖表的檔案時,增益集會讀取隱藏工作表上的資料,並將圖表載入記憶體中。 當使用者編輯圖表時,此記憶體內部結構會在每次儲存之前更新並重新寫入檔案。 此增益集假設讀取隱藏工作表並載入記憶體的唯一時間是開啟檔案時。

共同撰寫開啟另一個可能性:另一個執行相同增益集的使用者可以同時修改隱藏的工作表。 如果發生這種情況,使用者正在檢視的圖表可能會變得不同步。例如:

  • 假設使用者 A 開啟檔案,並開始檢視現有的自訂圖表。
  • 在執行此動作時,使用者 B 會開啟相同的檔案,並開始變更自訂圖表 (例如,變更圖表) 的類型。
  • 該變更會由使用者 B 電腦上的增益集儲存到工作表,但使用者 A 在重載檔案之前永遠不會看到變更。

因應措施

請盡可能避免假設何時可以變更活頁簿資料。 在此情況下,您可以修改增益集以回應 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

因此,在此情況下,不需要訂閱 BeforeRemoteChangeAfterRemoteChange 事件。

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

圖 1: 代表銷售量的圖表範例

銷售量

範例案例:資料一致性

系統會觸發變更事件,而且您的增益集程式碼會將活頁簿中的資料與活頁簿的另一個部分或外部系統中的資料同步處理。 如果遠端使用者收到導致增益集程式碼同步處理相同資料的變更,這可能會導致遠端使用者的效能降低或外部系統中的資料重複。

變更事件的潛在問題

雖然您通常不希望事件處理常式程式碼執行以回應來自遠端使用者的變更,但 引發變更事件的預設行為可能會造成問題。 以下是一些問題範例,以及如何使用 BeforeRemoteChangeAfterRemoteChange 事件來解決這些問題。

範例案例:資料視覺效果

您的增益集會根據在活頁簿中某個範圍中找到的位置資料,繪製地圖上的資料點。 如果使用者編輯任何位置資料,所有遠端使用者都應該收到這項變更,以便更新每個使用者的對應。

範例

假設您已建立自訂地圖。 在此範例中,您可以新增程式碼來變更位置資料,然後更新對應。 活頁簿會與不同城市中的某人共用。 開啟 AutoSave 時,變更會傳遞給遠端使用者,但不會更新該使用者的對應。

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 支援與意見反應