VBA技術解説
Evaluateメソッド(文字列の数式を実行します)

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
最終更新日:2020-01-30

Evaluateメソッド(文字列の数式を実行します)


Evaluateメソッドは、Excelで使用する名前をオブジェクトまたは値に変換します。
簡単に説明すれば、セルに入れる数式を文字列としてVBAで実行できます。


Evaluateメソッドの構文

式.Evaluate(name)

式には以下が指定できます。
Application
Worksheet
Chart ・・・ グラフシートです、具体的な使用方法が不明なので解説を省略します。
修飾せずにEvaluateとだけ記述した場合はApplicationになります。
Evaluateを実際に使用する場合の多くは、修飾せずにApplicationとして使用します。

引数name
Excelの名前付け規則を使用した、対象オブジェクトの数式または名前。
名前の長さは255文字以下にする必要があります。

A1形式の参照
単一セルに対するA1形式の参照であれば、特に制限はありません。
ただし、このメソッドでは、参照は常に絶対参照として扱われます。
範囲
参照と共に使うことのできる演算子には、
・セル範囲を表す参照演算子(:)
・セル参照の共通部分を表す参照演算子(スペース)
・セル参照の複数選択を表す参照演算子(,)
これらを使用できます。
定義された名前
シートで定義された名前定義の名前を指定できます。
外部参照
!演算子を使用して、セルまたは他のブックで定義されている名前を参照することができます。

Evaluateの糖衣構文として[ ]角括弧があります。
角括弧を使用してコードの記述を短くすることができますが、(変数等を使用した)動的な指定が出来ませんので、VBAで使う機会はかなり限られてきます。

Evaluateと角括弧の違いは、引数の数式を文字列で指定できるかどうかにあります。
角括弧では直接指定しますが、Evaluateでは引数に文字列を指定できます。
したがって、EvaluateではVBA内で作成した文字列が入った変数を使用することができます。

Evaluateメソッドの解説と使用例

文字列の数式を計算する

Debug.Print Evaluate("1+2+3")

Debug.Print [1+2+3]

Evaluateは文字列を""ダブルクォーテーションで囲み、文字列データとして引数に指定します。
糖衣構文の[]角括弧では直接記述します。

アクティブシートのセルを参照する

Debug.Print Evaluate("A1")

Debug.Print [A1]

Evaluateと[ ]での記述の違い、""ダブルクォーテーションで囲むかどうかの違いに注意してください。

ワークシートを指定してセルを参照する

Debug.Print Worksheets("Sheet1").Evaluate("A1")

Debug.Print Evaluate("Sheet1!A1")

Debug.Print [Sheet1!A1]

上記はいずれもSheet1のA1セルを参照しています。

名前定義でセル参照する

Worksheets("Sheet1").Range("A1").Name = "名前1"
Debug.Print Evaluate("名前1")

ここでは分かり易いようにVBAで名前定義していますが、
もちろん、事前に定義されている名前定義も使用できます。

ワークシート関数を実行する

Debug.Print Evaluate("SUM(A1:A3)")

Debug.Print [SUM(A1:A3)]

ワークシートのセルに入れることのできる数式であればEvaluateメソッドの引数として指定できます。
Evaluate("=SUM(A1:A3)")
このように、先頭の=を含めても構いません。

配列も返します

Dim ary
ary = Evaluate("A1:A3")

Dim ary
ary = [A1:A3]

この結果は、変数aryに配列が入ります。

マクロ VBA サンプル画像

ワークシートの配列定数式も使用できます。
Evaluate("{1,2,3}")
[{1,2,3}]

変数を使った複雑な指定

Dim arg1 As String
Dim arg2 As String
arg1 = "2020/1/5"
arg2 = "yyyy/mm/dd"
Debug.Print Evaluate("Text(""" & arg1 & """ + 1,""" & arg2 & """)")

"Text(""" & arg1 & """ + 1,""" & arg2 & """)"
この部分は実行時には、
"Text("2020/1/5" + 1,"yyyy/mm/dd")"
このよになります。
ワークシートで=からそのまま入れた結果と同じになります。

Evaluateメソッドの最後に

VBA内において、文字列として作成されている数式を計算する場合は、良い代替手段が無いのでEvaluateを使用してください。
もちろん、セルにその数式を入れてセル値を取得する事で代替え可能ではありますが、Evaluateを使えば簡単に実現できます。

ただし、VBAでそのようなことが必要になる事は稀でしょう。
シート設計およびVBAロジックを適切に作成すれば、Evaluateを使う必要性はあまりないはずです。
とはいえ、有効な代替え手段がない以上、少なくともEvaluateメソッドの存在は把握しておいた方が良いでしょう。

以下のページも参考にしてください。
文字列でのセル参照と文字列の計算式について(Evaluate,INDIRECT)
セルまたはセル範囲を表す文字列からセル参照する場合と、文字列としての計算式から計算する場合です。"Sheet1"の A1に、"Sheet2" B1に、"A1" "Sheet2"の A1に、"(2+3)*2" このよう…



同じテーマ「マクロVBA技術解説」の記事

シングルクォートの削除とコピー(PrefixCharacter)
空文字列の扱い方と処理速度について(""とvbNullString)
VBAにおける変数のメモリアドレスについて
Evaluateメソッド(文字列の数式を実行します)
Rangeオブジェクトの論理演算(差集合と排他的論理和)
VBAで写真の撮影日時や音楽動画の長さを取得する
VBAでWindowsMediaPlayerを使い動画再生する
VBAでWEBカメラ操作する
VBAで電光掲示板を作成
ユーザーに絶対に停止させたくない場合のVBA設定
列幅・行高をDPI取得しピクセルで指定する


新着記事NEW ・・・新着記事一覧を見る

シートコピー後のアクティブシートは何か|ツイッター出題回答 (2023-09-19)
Excel関数の引数を省略した場合について|ツイッター出題回答 (2023-09-14)
セル個数を返すRange.CountLargeプロパティとは|VBA技術解説(2023-09-08)
記号を繰り返してグラフ作成(10単位で折り返す)|ツイッター出題回答 (2023-08-28)
シートを削除:不定数のシート名に対応|VBAサンプル集(2023-08-24)
ランクによりボイントを付ける(同順位はポイントを分割)|ツイッター出題回答 (2023-08-22)
OneDrive使用時のThisWorkbook.Pathの扱い方|VBA技術解説(2023-07-26)
列幅不足による###表示や指数表示を判定する|VBA技術解説(2023-07-12)
シートを削除:不定数のシート名に対応|VBAサンプル集(2023-07-04)
シート関数のCOUNTIFS,SUMIFS,MAXIFSと同じ処理|Power Query(M言語)入門(2023-02-28)


アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.繰り返し処理(For Next)|VBA入門
4.変数宣言のDimとデータ型|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.マクロとは?VBAとは?VBAでできること|VBA入門
7.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
8.並べ替え(Sort)|VBA入門
9.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
10.条件分岐(IF)|VBA入門




このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。

記述には細心の注意をしたつもりですが、
間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。
掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。



このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。
本文下部へ