更新日:、 作成日:
VBA Evaluate 関数:エクセル数式の呼び出し
はじめに
Excel VBA マクロで Evaluate 関数からエクセル数式の呼び出し方を紹介します。
Evaluate("A1") のようにして、セル「A1」を取得できます。
Evaluate("SUM(A1:A3)") のようにして、SUM 関数からセル「A1」~「A3」の合計を取得できます。
[A1] のようにして、簡略して数式を入力できます。
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) を入力します。
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)"