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

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
公開日:2020-01-05 最終更新日: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)

・シングルクォーテーション意味 ・VBAでシングルクォーテーションがコピーされる場合と消える場合 ・VBAでのシングルクォーテーションの取得方法 ・VBAでシングルクォーテーションを取り除くVBA ・VBAでシングルクォーテーションを含めて値コピーするVBA
空文字列の扱い方と処理速度について(""とvbNullString)
・String型変数のメモリ配置と取得する関数 ・空文字列について ・String変数に空文字列を入れる ・セルに空文字列を入れる ・Stringが空文字列か判定 ・InputBox関数の戻り値が空文字列判定 ・空文字列の処理方法による速度比較
VBAにおける変数のメモリアドレスについて
・メモリアドレスを取得する関数とメモリコピーのWindowsAPI ・メモリアドレスを確認するために使用したVBA ・文字列型Stringのメモリアドレス ・Integer, Long, Single, Double, Dateのメモリアドレス ・Variantのメモリアドレス ・配列のメモリアドレス ・オブジェクトのメモリアドレス ・ByRef,ByValのメモリアドレス
Evaluateメソッド(文字列の数式を実行します)
Rangeオブジェクトの論理演算(差集合と排他的論理和)
・集合について ・Rangeオブジェクトの論理演算のVBAについて ・和集合:Unionメソッド ・積集合:Intersectメソッド ・補集合 ・差集合 ・排他的論理和 ・Rangeオブジェクトの論理演算VBAの使い方とテスト
VBAで写真の撮影日時や音楽動画の長さを取得する
・VBAで写真の撮影日時を取得 ・全てのプロパティを取得するVBA ・全てのプロパティを取得するVBAの使用例 ・VBAで撮影日時や音楽動画の長さ取得の最後に
VBAでWindowsMediaPlayerを使い動画再生する
・ワークシートにWindowsMediaPlayerを事前に追加 ・ワークシートにWindowsMediaPlayerコントロールを動的に追加 ・ユーザーフォームにWindowsMediaPlayerを事前に追加 ・ユーザーフォームにWindowsMediaPlayerを動的に追加 ・簡単に動画再生するだけなら ・VBAでの動画再生の最後に
VBAでWEBカメラ操作する
・ActiveMovie Windowを起動する ・メインのユーザーフォーム ・WEBカメラを選択するユーザーフォーム ・上記ユーザーフォームの使い方 ・APIを使いキャプチャをとる ・VBAでWEBカメラ操作の最後に
VBAで電光掲示板を作成
・東雲フォントについて ・東雲フォントの追加説明 ・東雲フォントをシートに取得するVBA ・電光掲示板のシート構成 ・電光掲示板のVBA ・VBAで電光掲示板を作成の最後に
ユーザーに絶対に停止させたくない場合のVBA設定
ユーザー操作によりマクロVBAが実行中に停止させられてしまう場合があります。再実行可能であれば問題ありませんが、途中で強制停止された場合のデータ保証が出来ないと言った場合もあるでしよう。マクロ実行でも、以下のキーボード操作でVBAは停止できてしまいます。
列幅・行高をDPI取得しピクセルで指定する
・列幅・行高をピクセルで指定するVBA ・列幅・行高をピクセルで指定するVBAの使い方と解説


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

TRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)
正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)
エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)
ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)
テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)
ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)
VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)
テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)
無効な前方参照か、コンパイルされていない種類への参照です。|エクセル雑感(2024-02-17)
初級脱出10問パック|VBA練習問題(2024-01-24)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.RangeとCellsの使い方|VBA入門
6.ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
7.セルのクリア(Clear,ClearContents)|VBA入門
8.条件分岐(Select Case)|VBA入門
9.メッセージボックス(MsgBox関数)|VBA入門
10.マクロとは?VBAとは?VBAでできること|VBA入門




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


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


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