更新日:、 作成日:

VBA Evaluate 関数:エクセル数式の呼び出し

はじめに

Excel VBA マクロで Evaluate 関数からエクセル数式の呼び出し方を紹介します。

Evaluate("A1") のようにして、セル「A1」を取得できます。

Evaluate("SUM(A1:A3)") のようにして、SUM 関数からセル「A1」~「A3」の合計を取得できます。

[A1] のようにして、簡略して数式を入力できます。

エクセル関数を呼び出すには「WorksheetFunction」をご覧ください。

Evaluate 関数

Evaluate("数式") のように入力します。数式の先頭に付ける = は省略できます。

Dim r As Range
Set r = Evaluate("A1")  ' セル A1、= を省略
Set r = Evaluate("=A1") ' セル A1

Dim l As Long
l = Evaluate("SUM(A1:B2)") ' A1 ~ B2 の合計
Debug.Print(l)

[数式] のように入力します。Evaluate を簡略して数式を入力できます。

Dim r As Range
Set r = [A1]  ' セル A1、= を省略
Set r = [=A1] ' セル A1

Dim l As Long
l = [SUM(A1:B2)] ' A1 ~ B2 の合計
Debug.Print(l)

数式が間違っているときは、エラーが発生しません。代わりに エラー 2029 のエラー値が取得されます。

どちらの方法でも同じ結果になります。入力しやすい方を選択します。

Evaluate か [] か

Evaluate なら変数に入っている数式を実行できます。

Dim s As String
s = "A1"  ' 数式

Dim r As Range
Set r = Evaluate(s) ' セル A1

[] ならエクセルの数式をコピーしてそのまま入力できます。数式の中にダブルクォーテーションで文字列を指定するときに簡単に入力できます。

Dim s As String
s = [LOWER("ABC")]             ' エクセルの数式と同じ
s = Evaluate("LOWER(""ABC"")") ' " をエスケープする必要がある

高速化

[] の入力が便利だからと言って、セル参照など VBA でできることを [] でやらない方がいいです。Evaluate の実行はパフォーマンスが悪いです。

別シートの数式を呼び出す

Evaluate や [] から数式を呼び出したときに参照されるシートは、VBA から Range でセルを指定するのと同じです。

シートを指定するには Worksheets の引数にシート名またはインデックスを指定します。

Sheet1 を指定するには Worksheets("Sheet1") または Worksheets(1) を入力します。

sheet1
Dim r As Range
' Sheet1 のセル「A1」の値を取得
Set r = Worksheets("Sheet1").Evaluate("A1")
Set r = Worksheets(1).[A1]
Debug.Print(r.Value)

' Sheet2 のセル「A1」の値を取得
Set r = Worksheets("Sheet2").Evaluate("A1")
Set r = Worksheets(2).[A1]
Debug.Print(r.Value)

Sheet1 に Evaluate などを入力すると、自身のシートのセルになります。自身を表す Me. が省略されています。

' どちらも同じコード
Evaluate("A1").Value = "Sheet1"
Me.Evaluate("A1").Value = "Sheet1"

標準モジュールに Evaluate などを入力すると、開いているシートのセルになります。アクティブシートを表す ActiveSheet. が省略されています。

' どちらも同じコード
Evaluate("A1").Value = "アクティブ"
ActiveSheet.Evaluate("A1").Value = "アクティブ"

セルに数式を入力する

セルに数式を入力するなら Range.Formula または Range.Formula2 プロパティから入力します。

Range("A1").Formula = "=SUM(A2:A3)"
Range("A1").Formula2 = "=SUM(A2:A3)"
詳しくは「セルに関数や数式を入力する」をご覧ください。