適用於:Excel 2013 |Office 2013 |Visual Studio
用戶可以透過數種方式在 Microsoft Excel 中觸發重新計算,例如:
- 如果 Excel 處於自動重新計算模式,請輸入新的資料 (,本主題稍後將) 說明。
- 明確指示 Excel 重新計算活頁簿的全部或部分。
- 刪除或插入數據列或數據列。
- 在設定 [ 儲存前重新計算 ] 選項時儲存活頁簿。
- 執行特定自動篩選動作。
- 按兩下自動計算模式) 中的數據列或資料列分隔線 (。
- 新增、編輯或刪除已定義的名稱。
- 重新命名工作表。
- 變更工作表相對於其他工作表的位置。
- 隱藏或取消隱藏資料列,但不隱藏數據行。
注意事項
本主題無法區分使用者直接按下按鍵或按鍵或按下滑鼠,以及由命令或巨集完成的工作。 用戶會執行命令,或執行某些動作來執行命令,使其仍被視為用戶動作。 因此,片語 「the user」 也表示「使用者,或用戶啟動的命令或進程」。
相依性、中途儲存格和重新計算的儲存格
Excel 中工作表的計算可視為三階段程式:
- 建構相依性樹狀結構
- 計算鏈的建構
- 單元格的重新計算
相依性樹狀結構會通知 Excel 哪些儲存格相依於哪些其他儲存格,或相等地,哪些儲存格是其他儲存格的前導。 Excel 會從這個樹狀結構建構計算鏈結。 計算鏈結會以計算公式的順序列出所有包含公式的單元格。 在重新計算期間,如果 Excel 遇到相依於尚未計算之儲存格的公式,則 Excel 會修改此鏈結。 在此情況下,正在計算的儲存格及其相依性會向下移至鏈結。 因此,在前幾個計算週期中剛開啟的工作表中,計算時間通常可以改善。
例如,對活頁簿進行結構變更時,當輸入新的公式時,Excel 會重新建構相依性樹狀結構和計算鏈結。 輸入新的數據或新公式時,Excel 會將相依於該新數據的所有儲存格標示為需要重新計算。 以這種方式標示的單元格稱為 「已變更」。 所有直接和間接相依項都會標示為已變更,因此如果 B1 相依於 A1,而 C1 相依於 B1,當 A1 變更時,B1 和 C1 都會標示為已變更。
如果儲存格直接或間接相依於本身,Excel 會偵測循環參考並警告使用者。 這通常是用戶必須修正的錯誤狀況,而 Excel 提供非常實用的圖形和導覽工具,協助使用者尋找迴圈相依性的來源。 在某些情況下,您可能會刻意想要此條件存在。 例如,您可能想要執行反覆計算,其中下一個反覆專案的起點是上一個反覆項目的結果。 Excel 支援透過 [計算選項] 對話方塊控制反復計算。
將儲存格標示為已變更之後,當下一次重新計算完成時,Excel 會以計算鏈結所指定的順序重新評估每個中途單元格的內容。 在稍早提供的範例中,這表示 B1 先是 ,然後是 C1。 如果重新計算模式是自動的,則在Excel完成將儲存格標示為已變更之後,就會立即重新計算;否則,會在稍後發生。
從 Microsoft Excel 2002 開始,Microsoft Visual Basic for Applications 中的 Range 物件 (VBA) 支援將單元格標示為需要計算的方法 Range.Dirty。 當它與 Range.Calculate 方法一起使用時 (請參閱下一節) ,它會啟用指定範圍內單元格的強制重新計算。 當您在巨集期間執行有限計算,而計算模式設定為手動時,這非常有用,以避免計算與巨集函數無關的單元格所產生的額外負荷。 範圍計算方法無法透過 C API 使用。
在 Excel 2002 和舊版中,Excel 會為每個開啟的活頁簿中的每個工作表建置計算鏈結。 這會在處理工作表之間的連結時產生一些複雜性,而且需要特別小心以確保有效率的重新計算。 特別是,在 Excel 2000 中,您應該以字母順序將跨工作表相依性和名稱工作表的名稱降到最低,讓相依於其他工作表的工作表依字母順序出現在相依的工作表之後。
在 Excel 2007 中,已改善邏輯以在多個線程上啟用重新計算,因此計算鏈結的區段不會互相相依,而且可以同時計算。 您可以將 Excel 設定為在單一處理器電腦上使用多個線程,或在多處理器或多核心電腦上使用單一線程。
異步使用者定義函式 (UDF)
當計算遇到異步 UDF 時,它會儲存目前公式的狀態、啟動 UDF 並繼續評估其餘單元格。 當計算完成評估儲存格時,如果仍有異步函式正在執行,Excel 會等候異步函式完成。 當每個異步函式報告結果時,Excel 會完成公式,然後執行新的計算階段,以重新計算使用單元格與異步函式參考的單元格。
動態和非揮發性函式
Excel 支援變動性函式的概念,也就是,即使其自變數未 (任何) 已變更,仍無法假設其值從一刻到下一刻都相同。 每次重新計算時,Excel 會重新評估包含動態函式的儲存格,以及所有相依項。 因此,過多依賴變動性函式可能會使重新計算時間變慢。 請謹慎使用它們。
下列 Excel 函式是動態的:
- 現在
- 今天
- RANDBETWEEN
- OFFSET
- INDIRECT
- INFO (視其自變數而定)
- CELL (取決於其自變數)
- SUMIF (視其自變數而定)
VBA 和 C API 都支援通知 Excel 使用者定義函式 (UDF) 應視為變動性處理的方式。 藉由使用 VBA,UDF 會宣告為變動性,如下所示。
Function MyUDF(MakeMeVolatile As Boolean) As Double
' Good practice to call this on the first line.
Application.Volatile MakeMeVolatile
MyUDF = Now
End Function
根據預設,Excel 會假設 VBA UDF 不會變動。 Excel 只會在 UDF 第一次呼叫 UDF 時才瞭解它是變動的。 如本範例所示,動態UDF可以變更回非揮發性。
使用 C API,您可以在第一次呼叫之前,將 XLL 函式註冊為 volatile。 它也可讓您開啟和關閉工作表函式的變動狀態。
根據預設,Excel 會處理採用範圍自變數且宣告為巨集工作表對等專案為 volatile 的 XLL UDF。 第一次呼叫 UDF 時,您可以使用 xlfVolatile 函式關閉此預設狀態。
計算模式、命令、選擇性重新計算和數據表
Excel 有三種計算模式:
- 自動
- 自動,但數據表除外
- 手動
當計算設定為自動時,會在每次數據輸入之後,以及在某些事件之後進行重新計算,例如上一節中提供的範例。 對於非常大型的活頁簿,重新計算時間可能太長,因此用戶必須在發生這種情況時加以限制,也就是只在需要時重新計算。 若要啟用此功能,Excel 支援手動模式。 用戶可以透過 Excel 功能表系統選取模式,或以程式設計方式使用 VBA、COM 或 C API 來選取模式。
數據表是工作表中的特殊結構。 首先,用戶會設定工作表上結果的計算。 這取決於一或兩個可變更索引鍵的輸入和其他參數。 用戶接著可以為一或兩個索引鍵輸入建立一組值的結果數據表。 數據表是使用 [數據表精靈] 所建立。 設定數據表之後,Excel 會逐一將輸入插入計算中,並將產生的值複製到數據表中。 因為可以使用一或兩個輸入,所以數據表可以是一維或二維。
資料表的重新計算處理方式稍有不同:
- 重新計算會以異步方式處理為一般活頁簿重新計算,因此大型數據表重新計算所需的時間可能會比活頁簿的其餘部分還長。
- 循環參考是可容許的。 如果用來取得結果的計算相依於數據表中的一或多個值,Excel 就不會傳回迴圈相依性的錯誤。
- 數據表不會使用多線程計算。
由於 Excel 處理數據表重新計算的方式不同,而且相依於複雜或冗長計算的大型數據表可能需要很長的時間來計算,Excel 可讓您停用數據表的自動計算。 若要這樣做,請將計算模式設定為 [自動],但 [數據表] 除外。 當計算處於此模式時,使用者會按 F9 或一些對等的程式設計作業來重新計算數據表。
Excel 會公開可讓您改變重新計算模式和控制重新計算的方法。 這些方法已從版本改良為版本,以允許更精細的控制。 這方面 C API 的功能反映 Excel 第 5 版中提供的功能,因此不會提供您在較新版本中使用 VBA 的相同控件。
當 Excel 處於手動計算模式時最常使用,這些方法允許選擇性計算活頁簿、工作表和範圍、完整重新計算所有開啟的活頁簿,甚至是完整重建相依性樹狀結構和計算鏈結。
範圍計算
擊鍵:無
VBA:在 Excel 2000 中引進的 Range.Calculate (,已在 Excel 2007) 和 Range.CalculateRowMajorOrder 中變更 (於 Excel 2007)
C API:不支援
手動模式
不論儲存格是否已變更,只重新計算指定範圍內的儲存格。 在 Excel 2007 中變更 Range.Calculate 方法的行為;不過, Range.CalculateRowMajorOrder 方法仍然支援舊的行為。
自動或自動數據表模式除外
重新計算活頁簿,但不會強制重新計算範圍或範圍中的任何單元格。
使用中工作表計算
按鍵:SHIFT+F9
VBA: ActiveSheet.Calculate
C API: xlcCalculateDocument
所有模式
只在使用中工作表中重新計算標示為要計算的儲存格。
指定的工作表計算
擊鍵:無
VBA: **Worksheets (**reference ) 。算
C API:不支援
- 所有模式
只在指定的工作表中重新計算中途儲存格及其相依性。 參考是工作表的名稱,做為字串或相關活頁簿中的索引編號。
Excel 2000 和更新版本會公開 布爾 工作表屬性 EnableCalculation 屬性。 將此值從 False 設定為 True 會填滿指定工作表中的所有儲存格。 在自動模式中,這也會觸發整個活頁簿的重新計算。
在手動模式中,下列程式代碼只會重新計算使用中工作表。
With ActiveSheet
.EnableCalculation = False
.EnableCalculation = True
.Calculate
End With
活頁簿樹狀結構重建和強制重新計算
按鍵:Excel 2002) 中引進的 CTRL+ALT+SHIFT+F9 (
VBA:**活頁簿 (**參考 ) 。Excel 2007) 中導入的 ForceFullCalculation (
C API:不支援
所有模式
使 Excel 重建指定活頁簿的相依性樹狀結構和計算鏈結,並強制重新計算包含公式的所有單元格。
所有開啟的活頁簿
擊鍵:F9
VBA: Application.Calculate
C API: xlcCalculateNow
所有模式
重新計算所有 Excel 標示為「已變更」的儲存格,也就是根據動態或已變更的資料,以及程式設計方式所標示的「已變更」。 如果計算模式為 [自動例外數據表],這會計算需要更新的數據表,以及所有變動性函式及其相依專案。
所有開啟的活頁簿樹狀結構重建和強制計算
按鍵:CTRL+ALT+F9
VBA: Application.CalculateFull
C API:不支援
所有模式
重新計算所有開啟活頁簿的全部儲存格。 如果計算模式為 [自動例外數據表],則會強制重新計算數據表。