Share via


公式與公式 2

Range.Formula 和 Range.Formula2 是代表公式中邏輯的兩種不同方式。 這些方言可視為 Excel 公式語言的 2 個方言。

Excel 一律支援兩種類型的公式評估:隱含交集評估 (「IIE」) 和陣列評估 (「AE」) 。 在導入動態陣列之前,IIE 是儲存格公式的預設值,而 AE 則會在其他 (條件式格式設定、資料驗證、CSE 陣列公式等) 使用。

這兩種評估形式的主要差異在於,當多儲存格範圍 (例如 A1:A10) 傳遞至預期單一值的函式時,兩者的行為方式如下:

  • IIE 會選擇與公式位於相同資料列或資料行上的儲存格。 這項作業稱為「隱含交集」。
  • AE 會使用多儲存格範圍中的每個儲存格來呼叫 函式,並傳回結果陣列。 這項作業稱為「解除」。

當 Range.Formula 用來設定儲存格的公式時,會使用 IIE 進行評估。

引進 Dyanamic Arrays (「DA」) ,Excel 現在支援將多個值傳回格線,而 AE 現在是預設值。 您可以使用取代 Range.Formula2 的 Range.Formula2 來設定/讀取 AE 公式。 不過,為了促進反相容性,仍支援 Range.Formula,並會繼續設定/傳回 IIE 公式。 使用 Range.Formula 的公式集合會觸發隱含交集,而且永遠不會溢出。 使用 Range.Formula 讀取的公式會在隱含交集發生的位置繼續為無訊息。

Range.Formula 會有效地報告在 Pre-DA Excel 的公式列中呈現的內容,而 Range.Formula2 則會報告 DA Excel 中公式列所報告的公式。

Excel 會自動在這兩個公式變化之間轉譯,因此可以讀取和設定。 為了協助使用 IIE) 將 Range.Formula (轉譯到 Range.Formula2 (AE) ,Excel 會使用新的隱含交集運算子 @,指出隱含交集可能發生的位置。 同樣地,若要使用 AE) 從 Range.Formula2 (轉譯到 Range.Formula (使用 IIE) Excel 將會移除以無訊息方式執行的 @ 運算子。 這兩者通常沒有任何差異。

從 Range.Formula 轉譯為 Range.Formula2

此範例顯示設定 Range.Formula 然後擷取 Range.Formula2 的結果

Dim cell As Range
Dim str As String

Set cell = Worksheets("Sheet1").Cells(2, 1)
ArrayOfFormulas = Array("=SQRT(A1)", "=SQRT(A1:A4)")

For i = LBound(ArrayOfFormulas) To UBound(ArrayOfFormulas)
 cell.Formula = ArrayOfFormulas(i)
 str = "Wrote Range.Formula:" & vbCr & cell.Formula & _
    vbCr & vbCr & _
    "Read Range.Formula2:" & vbCr & cell.Formula2
 MsgBox (str)
Next i
寫入 Range.Formula 讀取 Range.Formula2 附註
=SQRT (A1) =SQRT (A1) 相同,因為不會發生隱含交集
=SQRT (A1:A4) =SQRT (@A1:A4) SQRT 需要單一值,但會提供多儲存格範圍。 這會在 IIE 中觸發隱含交集,其中將轉譯為 AE 會使用 @ 運算子來指出隱含交集可能發生的位置

從 Range.Formula2 轉譯為 Range.Formula

使用 Range.Formula2 Excel 設定的公式會使用 AE。 儲存檔案時,DA Excel 會檢查活頁簿中的公式,以判斷它們是否會在 AE 和 IIE 中計算相同。 如果這樣做,為了改善反向相容性,Excel 可能會將它儲存為 IIE,以減少 Pre DA 版本 Excel 所看到的陣列公式數目。 您可以使用 Range.SavedAsArray () 測試公式是否會儲存為檔案作為陣列公式

Dim cell As Range
Dim str As String

Set cell = Worksheets("Sheet1").Cells(2, 1)
ArrayOfFormulas = Array("=SQRT(A1)", "=SQRT(@A1:A4)", "=SQRT(A1:A4)", "=SQRT(A1:A4)+SQRT(@A1:A4)")

For i = LBound(ArrayOfFormulas) To UBound(ArrayOfFormulas)
 cell.Formula2 = ArrayOfFormulas(i)
 str = "Wrote Range.Formula2:" & vbCr & cell.Formula2 & _
    vbCr & vbCr & _
    "Read Range.Formula:" & vbCr & cell.Formula & _
    vbCr & vbCr & _
    "Read Range.IsSavedAsArray:" & vbCr & cell.SavedAsArray
 MsgBox (str)
Next i
寫入 Range.Formula2 讀取 Range.Formula 讀取 Range.SavedAsArray 附註
=SQRT (A1) =SQRT (A1) FALSE SQRT 需要單一值,A1 是單一值。 IIE 與 AE 之間沒有差異。 另存為 IIE 並移除任何 @'s
=SQRT (@A1:A4) =SQRT (A1:A4) FALSE SQRT 需要單一值, @A1:A4 是單一值。 IIE 與 AE 之間沒有差異。 另存為 IIE 並移除任何 @'s
=SQRT (A1:A4) =SQRT (A1:A4) TRUE SQRT 需要單一值,A1:A4 是多重銷售範圍。 IIE 和 AE 可能會因為另存為數組而有所不同
=SQRT (A1:A4) + SQRT (@A1:A4) =SQRT (A1:A4) + SQRT (@A1:A4) TRUE 第一個 SQRT 需要單一值,A1:A4 是多重銷售範圍。 IIE 和 AE 可能會因為另存為數組而有所不同

最佳作法

如果以 EXCEL 的 DA 版本為目標,您應該在 Range.Formula 的喜好設定中使用 Range.Formula2。

如果以 Excel 的 Pre 和 Post DA 版本為目標,您應該繼續使用 Range.Formula。 不過,如果您想要嚴格控制使用者公式列公式的外觀,您應該偵測是否為 。支援 Formula2,如果支援,則使用 。否則,Formula2 會使用 。公式

附註

OfficeJS 不包含 Range.Formula2。 相反地,Range.Formula 一律會報告公式列中的內容。 作為能夠讓增益集快速部署更新的較新語言,如果開發人員在 AE 到 IIE 之間遇到任何相容性問題,則建議他們更新其增益集。

支援和意見反應

有關於 Office VBA 或這份文件的問題或意見反應嗎? 如需取得支援服務並提供意見反應的相關指導,請參閱 Office VBA 支援與意見反應