AutoSave 如何影響增益集和巨集
瞭解 AutoSave 在 Excel、PowerPoint 和 Word 中的運作方式,以及它如何影響增益集或宏。
自動儲存概觀
當檔案裝載于雲端 (即 OneDrive、商務用 OneDrive或 SharePoint Online) 時,AutoSave 可讓使用者的編輯自動且持續地儲存。 當檔案與其他人共用時,其變更會合並至此使用者的檔案版本。 如果 [自動儲存] 已關閉,則必須手動觸發儲存,使用者的變更才能保存在雲端,並讓此使用者接收其他人的變更。
目前,Excel、Word 和 PowerPoint 提供 BeforeSave 事件,可讓開發人員在使用者觸發儲存之後,但在儲存發生之前執行程式碼。 Excel 也提供 AfterSave 事件,可以在儲存完成後執行宏或增益集程式碼。
啟用 AutoSave 時,這些事件會定期自動引發,而不需要使用者互動。 因此,當 AutoSave 開啟時,利用這些事件的增益集和宏可能會遇到問題。
一般而言,如果使用者選擇停用 AutoSave,就可以避免這些問題。 您可以在Word、Excel和PowerPoint中使用AutoSaveOn屬性來代表使用者執行此動作 (請參閱下列範例) 。 您也可以以開發人員身分採取步驟來減輕這些問題,讓您的增益集和宏順利運作,即使已啟用 AutoSave 也一樣。
範例
此範例會關閉自動儲存,並通知使用者活頁簿不會自動儲存。
Sub UseAutoSaveOn()
ActiveWorkbook.AutoSaveOn = False
MsgBox "This workbook is being saved automatically: " & ActiveWorkbook.AutoSaveOn
End Sub
儲存事件和自動儲存的潛在問題
您可能需要處理下列有關儲存事件與自動儲存之間互動的一或多個問題:
- BeforeSave或AfterSave事件中的程式碼執行太長
- 儲存事件中的程式碼會呈現強制回應對話方塊
- 儲存事件中的程式碼只會清除 Excel (復原堆疊)
- AfterSave 中的程式代碼只會在 Excel (活頁簿)
- BeforeSave中的程式碼會藉由將 Cancel 引數設定為 True 來取消檔案儲存 ()
問題 1:BeforeSave 或 AfterSave 事件中的程式碼執行太長
一般而言,執行增益集或宏程式碼時,Word、Excel 和 PowerPoint 不會回應使用者互動。 因此,如果您在 BeforeSave 或 AfterSave 事件處理常式中的程式碼執行時間太長,可能會大幅降低使用者體驗。
停用 AutoSave 時,只有在使用者明確選擇儲存時,才會執行此程式碼,因此延遲不會那麼明顯,而且使用者可以避免延遲,直到使用者準備好儲存為止。
啟用 AutoSave 時,此程式碼會定期自動執行,這可能會中斷使用者,尤其是在程式碼需要很長的時間時。
案例範例
假設有一個增益集可讓使用者根據 Excel 活頁簿中的資料建立自訂地圖。 這類增益集可能有 BeforeSave 程式碼,可序列化使用者已建立的任何對應,並將它們儲存在 CustomXML 元件的活頁簿中。 此程式可能需要一秒鐘的時間才能完成,而 Excel 可能會在發生這種情況時沒有回應。
當 AutoSave 關閉時,使用者可以選擇何時要儲存,因此,即使增益集稍微降低儲存程式的速度,使用者也不會注意到。
啟用 AutoSave 時,此 BeforeSave 程式碼會定期自動執行,即使使用者正在進行其他 (,例如將資料輸入資料) ,這可能會非常令人困擾。
因應措施
增益集應該嘗試避免在儲存事件內長時間執行的作業。 在此範例中,開發人員可以選擇在使用者建立或修改檔案時,將自訂對應保存到檔案,而不是等待儲存事件。
問題 2:儲存事件中的程式碼會顯示模式對話方塊
任何在儲存事件中執行的程式碼,如強制回應對話方塊等 UI,都可能會在 AutoSave 開啟時嚴重降低使用者體驗。 由於 BeforeSave 和 AfterSave 事件會定期自動執行,因此這些對話方塊可能會中斷使用者的正常工作流程。
案例範例
增益集會在儲存前驗證 Word 檔,以確保已套用公司商標,可能會引發對話方塊,警示使用者發現的任何問題,並提供修正方法。 因為 BeforeSave 事件現在會自動且持續地引發,所以當使用者執行其他動作時,這個驗證對話方塊可能會突然出現。
因應措施
請考慮移除需要對應用程式的其他區域顯示 UI 的任何程式碼。 例如,使用者可以選取 [驗證] 按鈕來觸發驗證程式,或者只有在使用者嘗試變更現有資料時,您才能引發驗證碼。
如果您只想在第一次從新檔儲存時觸發驗證程式代碼,而不是在後續自動儲存時觸發,請考慮先檢查 Excel 的 Workbook.Path 等屬性,再于 BeforeSave 或 AfterSave期間顯示任何 UI。 在 Excel 中,如果活頁簿還沒有儲存位置, Workbook.Path 屬性應該是空白的。
問題 3:儲存事件中的程式碼只會清除 Excel (復原堆疊)
一般而言,如果您在 Excel 中執行某些 VBA 語句,將會清除復原堆疊。 例如,如果您執行 來變更儲存格 ActiveCell.Value = "myValue"
的值,則會清除復原堆疊。 如果宏或增益集的 BeforeSave 或 AfterSave 事件中出現這類程式碼,且 AutoSave 已開啟,則該宏或增益集的使用者通常無法如預期般復原一般使用者動作。
案例範例
增益集可能會有執行以回應 BeforeSave 事件的程式碼,該事件會檢查檔並將值寫入活頁簿中的「記錄」資料表。 開啟 AutoSave 時,這會定期清除復原堆疊,這可能會讓使用者感到困擾。
因應措施
請考慮移除在 BeforeSave 或 AfterSave 事件中寫入活頁簿 的 程式碼。 例如,範例案例中所述的增益集可能會修改為將變更記錄檔儲存在個別的檔案或資料庫中。
問題 4: AfterSave 中的程式碼只會 (Excel 存取活頁簿)
當 AutoSave 開啟時,只有在活頁簿自上次觸發後有所變更時,才會觸發 BeforeSave 和 AfterSave 事件。 如果 AfterSave 事件中的程式碼使活頁簿 (,也就是) 進行其他變更,這可能會觸發事件再次引發相同的變更,然後將事件排入佇列以無限期地再次引發。 這可能會浪費系統資源,並影響電池使用時間。
因應措施
在 AfterSave 中重新安裝活頁簿的程式碼應該移至 BeforeSave 或完全移至另一個位置 (請參閱 問題 3) 。 即使沒有 AutoSave,目前也不是個好做法,因為它會讓活頁簿處於永久的「中途」狀態,這會導致提示在關閉時出現,要求使用者儲存其變更,即使未進行其他變更也一樣。
問題 5: BeforeSave 中的程式碼會將 Cancel 引數設定為 True,以取消檔案儲存 ()
現在,您可以將 設 Cancel
為 True,取消BeforeSave事件中的儲存:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Cancel = True
End Sub
啟用 AutoSave 時,應用程式 (即 Excel、Word 或 PowerPoint) 觸發程式會連續自動儲存,直到檔案不再有未儲存的變更為止。 在使用者對檔案進行單一變更之後,應用程式會嘗試儲存它。
如果開發人員選擇以先前所述的方式取消儲存,應用程式會持續判斷是否有未儲存的變更,這會導致儲存 (最後) 再試一次。 因為取消第一次儲存的相同事件代碼也會取消第二次儲存嘗試,所以只要檔案開啟,程式就會繼續進行,這可能會降低效能和電池使用時間。
案例範例
增益集可能會完全覆寫預設 Word 儲存程式碼,以便將檔案儲存至公司資料庫,而不是儲存至磁片或 SharePoint 位置。 這類增益集會先取消嘗試的儲存,再嘗試儲存在另一個地方。
因應措施
這類增益集應該藉由將 AutoSaveOn 設定為 False,以確保自動儲存已關閉。 因為檔案必須已儲存在 OneDrive 或 SharePoint 位置,AutoSave 才能開啟,所以在此案例的大部分版本中,自動儲存應該已經關閉或停用。
另請參閱
- 在 Excel 中共同撰寫
- Document 物件
- Presentation 物件
- Workbook 物件
- Excel 中的AfterSave事件
- Excel 中的 BeforeSave 事件
- PowerPoint 中的BeforeSave事件
- Word 中的BeforeSave事件
支援和意見反應
有關於 Office VBA 或這份文件的問題或意見反應嗎? 如需取得支援服務並提供意見反應的相關指導,請參閱 Office VBA 支援與意見反應。