数式と数式 2

Range.Formula と Range.Formula2 は、数式内のロジックを表す 2 つの異なる方法です。 Excel の数式言語の 2 つの方言を考えることができます。

Excel では、暗黙的積集合評価 ("IIE") と配列評価 ("AE") の 2 種類の数式評価が常にサポートされています。 動的配列の導入以前は、IIE がセル数式の既定値でしたが、AE は他のすべての場所 (条件付き書式、データ検証、CSE 配列数式など) で使用されていました。

評価の 2 つの形式の主な違いは、複数セル範囲 (A1:A10 など) が単一の値を期待する関数に渡されたときの動作でした。

  • IIE は、数式と同じ行または列のセルを選択します。 この操作は、"暗黙的な積集合" と呼ばれます。
  • AE は、複数セル範囲内の各セルで 関数を呼び出し、結果の配列を返します。 この操作は"持ち上げ" と呼ばれます。

セルの数式を設定するために Range.Formula を使用する場合、IIE が評価に使用されます。

Dyanamic Arrays ("DA") の導入により、Excel では複数の値をグリッドに返すのがサポートされ、AE が既定値になりました。 AE 数式は、Range.Formula2 を使用して設定または読み取ることができます。これは Range.Formula に置き換えられます。 ただし、バック互換性を容易にするために、Range.Formula は引き続きサポートされており、引き続き IIE 数式を設定/返します。 Range.Formula を使用して数式を設定すると、暗黙的な積集合がトリガーされ、スピルすることはありません。 Range.Formula を使用した数式の読み取りは、暗黙的な積集合が発生した場所では、引き続きサイレントになります。

Range.Formula は、DA 以前の Excel の数式バーに表示される内容を効果的に報告し、Range.Formula2 は DA Excel の数式バーによってレポートされる数式を報告します。

Excel では、これら 2 つの数式バリエーションの間で自動的に変換されるため、読み取りと設定が可能です。 Range.Formula (IIE を使用) から Range.Formula2 (AE) への変換を容易にするために、Excel は、新しい暗黙的な積集合演算子 @を使用して暗黙的な積集合が発生する可能性がある場所を示します。 同様に、Range.Formula2 (AE を使用) から Range.Formula (IIE を使用) への変換を容易にするために、Excel では、サイレントモードで実行される @ 演算子が削除されます。 多くの場合、2 つの間に違いはありません。

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
範囲の書き込み.数式 範囲の読み取り.Formula2 Notes (メモ)
=SQRT(A1) =SQRT(A1) 暗黙的な積集合が発生しないため、同一
=SQRT(A1:A4) =SQRT(@A1:A4) SQRT は 1 つの値を受け取りますが、複数セル範囲が指定されます。 これにより、IIE の暗黙的な積集合がトリガーされ、AE への変換で @ 演算子を使用して暗黙的な積集合が発生する可能性がある場合に呼び出されます。

Range.Formula2 から Range.Formula への変換

Range.Formula2 Excel を使用した数式セットでは、AE が使用されます。 ファイルの保存時に、DA Excel はブック内の数式を調べて、AE と IIE で同じ数式を計算するかどうかを判断します。 その場合、バック互換性を向上させるために、Excel は IIE として保存して、Excel の Pre DA バージョンで見られる配列数式の数を減らすことができます。 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
Write Range.Formula2 範囲の読み取り.数式 読み取り範囲.SavedAsArray Notes (メモ)
=SQRT(A1) =SQRT(A1) FALSE SQRT では 1 つの値が必要です。A1 は 1 つの値です。 そのため、IIE と AE の間に分散はありません。 IIE として保存し、@'s を削除します
=SQRT(@A1:A4) =SQRT(A1:A4) FALSE SQRT では 1 つの値が必要です。 @A1:A4 これは 1 つの値です。 そのため、IIE と AE の間に分散はありません。 IIE として保存し、@'s を削除します
=SQRT(A1:A4) =SQRT(A1:A4) TRUE SQRT では 1 つの値が必要です。A1:A4 はマルチセル範囲です。 IIE と AE は、配列として保存する場合に異なる場合があります
=SQRT(A1:A4)+ SQRT(@A1:A4) =SQRT(A1:A4)+ SQRT(@A1:A4) TRUE 最初の SQRT では 1 つの値が想定され、A1:A4 はマルチセル範囲です。 IIE と AE は、配列として保存する場合に異なる場合があります

ベスト プラクティス

DA バージョンの Excel を対象とする場合は、Range.Formula2 を Range.Formula に優先して使用する必要があります。

Excel の Pre バージョンと Post DA バージョンを対象とする場合は、Range.Formula を引き続き使用する必要があります。 ただし、ユーザーの数式バーの外観を厳密に制御する場合は、 かどうかを検出する必要があります。Formula2 はサポートされており、サポートされている場合は を使用します。それ以外の場合は、Formula2 で を使用します。式

Notes (メモ)

OfficeJS には Range.Formula2 は含まれません。 代わりに、Range.Formula は常に数式バーに存在するものを報告します。 アドインが更新プログラムを迅速に展開できる新しい言語として、開発者は AE から IIE の間で互換性の問題が発生した場合にアドインを更新することをお勧めします。

サポートとフィードバック

Office VBA またはこの説明書に関するご質問やフィードバックがありますか? サポートの受け方およびフィードバックをお寄せいただく方法のガイダンスについては、Office VBA のサポートおよびフィードバックを参照してください。