TL;DR —
Evaluate("SUM(A1:A10)")は、数式を テキストとして Excel の計算エンジンに渡し、結果を返します。[ ]の省略記法 —[A1]、[SUM(A1:A10)]— は、文字どおりEvaluateの変装です。肝心の違いはこうです。かっこの 中は 固定のテキスト なので、そこに変数を差し込むことはできません。Evaluate(aString)は、実行時に組み立てた文 字列を受け取ります。おかしな数式は、クラッシュではなく エラー Variant として返ってくるので、使う前にIsErrorで確かめましょう。コードの中で組み立てた数式を実行するために手を伸ばすものです — そうでなければ、普通のセルの数式やWorksheetFunctionのほうが分かりやすいです。
Sub EvaluateAFormula()
Dim result As Variant
result = Evaluate("SUM(A1:A10)") ' Excel が計算する、セルと同じように
If IsError(result) Then
MsgBox "That formula did not compute"
Else
MsgBox "Total: " & result
End If
End Sub
この一族のほかの二つは コード を名前で実行します — Application.Run はマクロを、
CallByName はメンバーを実行します。Evaluate は 数式 を実行することで、この組を完成さ
せます。ワークシートの式をテキストとして Excel に手渡すと、セルが使うのとまったく同じエンジンで答えを計算してくれるの
です。それが三つすべての背後にあるひとつの考え方 — 文字列が、実行時に実行されるアクションになる — であり、
Evaluate はそのなかで最も Excel らしい形です。渡す文字列がただの数式、つまりあなたがグリッドですでに知っている言語
だからです。同じ警告が引き継がれます。数式はテキストなので、実行されるまで何もそれを確かめません。ですから Evaluate
には、自分で組み立てたか検証した式だけを渡しましょう。
この記事で学べること
EvaluateがApplication.RunとCallByNameの隣でどこに位置するか- 角かっこの省略記法
[ ]と、それが同じメソッドである理由 - 決定的な違い:かっこは固定のテキスト、
Evaluateは実行時の文字列を受け取る - おかしな数式が返すエラー Variant を、
IsErrorで読み取る - 参照が意図した場所で解決されるよう、呼び出しを正しいシートに修飾する
EvaluateをWorksheetFunctionやセルの数式のどちらと使い分けるか
考え方の軸:ワークシートの計算エンジンを借りる
Excel で値を計算するものはすべて — あらゆる =SUM(...)、あらゆる =VLOOKUP(...) — 一つの計算エンジンを通ります。
Evaluate は、VBA からそのエンジンに入る扉です。数式を、セルに打ち込むのと同じように(先頭の = はあってもなくて
も)渡すと、Excel がそれを評価し、結果を Variant として返してくれます。
d = Evaluate("TODAY()") ' 日付
n = Evaluate("2*PI()*10") ' 数値
r = Evaluate("VLOOKUP(""Ada"", A:B, 2, 0)") ' 検索、文字列のために引用符を二重にしている
考え方の転換は、ここで書いているのが VBA のロジックではない、という点です — あなたは Excel の数式 を書いて、それを
実行してくれと Excel に頼んでいるのです。セルで有効なものは何でも Evaluate の中でも有効で、VBA に相当するものがない
関数も含まれます。
角かっこの省略記法は Evaluate の変装
これはほとんど誰もが驚くところです。他人のマクロで見かけた [ ] の記法は、特別な演算子ではありません。Evaluate の
省略記法なのです。この二行は同一です。
x = [SUM(A1:A10)] ' 省略記法
x = Evaluate("SUM(A1:A10)") ' 実際にしていること
[A1] は Evaluate("A1") であり、[Sales](名前付き範囲)は Evaluate("Sales") であり、[1+2] は 3 を返す
Evaluate("1+2") です。かっこを Evaluate として見ることが、このページを一族のほかと結びつける「なるほど」の瞬間で
す。あのすっきりした省略記法さえ、表面下では文字列駆動の間接呼び出しなのです。
肝心の違い:かっこは固定、Evaluate は変数を受け取る
どちらの形を使うかを決める唯一の規則であり、もっともよくある混乱の元がこれです。[ ] の中のテキストは リテラル
です — そこに変数を連結することはできません。かっこは文字列ではないからです。
Dim col As String: col = "B"
' WRONG - you cannot build a bracket expression from a variable:
' total = [SUM(col & "1:" & col & "10")] ' 期待どおりには動かない
' RIGHT - build the string, then Evaluate it:
total = Evaluate("SUM(" & col & "1:" & col & "10)") ' SUM(B1:B10)
ですから選択は機械的です。数式全体が一度だけ打ち込む 定数 なら [ ] を使いましょう — 短くて読みやすいです。数式の
どこか一部でも変数やセルの値、ユーザー入力から 実行時に組み立てられる なら、その瞬間に Evaluate(...) を使いま
す。それが二つの形の実用上の違いのすべてで、動的な数式にかっこの形を選んでしまうことが、人が「かっこが壊れている」と結
論づける原因です — 実際にはそれが、変数には向かない道具なだけなのです。
結果を読む:おかしな数式はエラー Variant を返す
Evaluate は、数式が間違っていても実行時エラーを起こしません — #NAME?、#REF!、#DIV/0! などの VBA 版である
エラー Variant を返します。確かめずに結果を使うと、エラーは静かに伝播していきます。
Dim result As Variant
result = Evaluate("SUM(Nonexistent)") ' エラー Variant を返す、クラッシュはしない
If IsError(result) Then
MsgBox "Formula error - check the expression"
Else
' result を安全に使える
End If
実行時に組み立てた式は、値を信頼する前に必ず IsError でガードしましょう。これは
WorksheetFunction とは逆の振る舞いです。あちらは失敗すると、捕まえられる実行時エ
ラーを 起こします — 両者を使い分けるときに知っておく価値のある違いです。
参照が意図した場所で解決されるよう、呼び出しを修飾する
修飾のない Evaluate(および [ ] の省略記法すべて)は、参照を アクティブシート に対して解決します。アクティブシ
ートが意図したものでなければ、Evaluate("A1") は間違ったセルを読みます — 開発者がテストしたのとは別のシートからマクロ
が実行されるときの、見えにくいバグです。呼び出しを修飾して、行き先を固定しましょう。
' Resolves A1:A10 on Sheet1 no matter which sheet is active:
total = Worksheets("Sheet1").Evaluate("SUM(A1:A10)")
Worksheet.Evaluate と Workbook.Evaluate を使えば、数式が どこで 実行されるかを指定できます。アクティブシートに頼
るのは、その場かぎりの手早い処理なら問題ありません。しかし世に出すものなら、ユーザーがたまたま最後にクリックした場所に
左右されないよう、呼び出しを修飾しましょう。
Evaluate と WorksheetFunction とセルの数式
計算された値を得る三つの方法、それぞれに役割があります。セルの数式 は、結果がシートに属し、再計算されるべきときに
正解です — セルに =SUM(A1:A10) を入れます。WorksheetFunction は、IntelliSense
と、捕まえられるきれいなエラーとともに、VBA から特定の関数を使いたいときに正解です:WorksheetFunction.Sum(Range("A1:A10"))。
Evaluate は、式そのもの が動的なとき — 数式の文字列を実行時に組み立てたとき — や、WorksheetFunction が公開し
ていないワークシート関数が必要なときに正解です。数式が定数で、その関数が WorksheetFunction にあるなら、
WorksheetFunction を選びましょう。そのほうが分かりやすく、エラーも扱いやすいです。
ExcelMaster の活用
ここでの落とし穴は静かです。変数を黙って無視するかっこの形、数値であるかのように使われるエラー Variant、間違ったシー トを読む修飾のない参照。どれも自分から名乗り出てはくれません。
ExcelMaster には、計算を普通の言葉で伝えられます
— 「この列を — レポートが選んだのがどの列であっても — 合計して、数式が失敗したら知らせて」 — すると、文字列を安全に組
み立て、IsError で確かめ、シートを修飾する Evaluate のコードを書いてくれます。ブックとコードはあなたの手元に残り、
静かな誤答も避けられます。
よくある質問
VBA の Evaluate は何をするものですか?
Evaluate("expression") は、テキストとして書かれた Excel のワークシート数式を Excel の計算エンジンに渡し、計算結果を
Variant として返します。セルで有効なものは、その中でも何でも動きます。実行時に組み立てた数式を実行したり、
WorksheetFunction が公開していないワークシート関数に到達したりするために使います。
VBA の角かっこは何を意味しますか?
[ ] の記法は Evaluate の省略記法です:[A1] は Evaluate("A1") であり、[SUM(A1:A10)] は
Evaluate("SUM(A1:A10)") です。定数の式には短くて済みますが、中のテキストはリテラルです — かっこの中に変数を連結する
ことはできません。数式のどこか一部でも動的なときは、代わりに完全な Evaluate(aString) の形を使います。
角かっこの中に変数を入れられないのはなぜですか?
[ ] は文字列ではないからです — それは Evaluate にそのまま手渡される固定のテキストなので、[col & "1"] は col か
ら参照を組み立てません。数式を文字列として組み立てて Evaluate に渡しましょう:Evaluate("SUM(" & col & "1:" & col & "10)")。
それこそが、省略記法と並んで完全な形が存在する理由のすべてです。
Evaluate がエラーを返したかどうかを確かめるには?
Evaluate は、おかしな数式に対して実行時エラーを起こすのではなく エラー Variant を返します。ですから使う前に
IsError(result) で結果を確かめましょう。これは、代わりに捕まえられるエラーを起こす
WorksheetFunction とは異なります — 値を確かめたいか、例外を処理したいか、どちらを
好むかで選びましょう。
Evaluate と WorksheetFunction のどちらを使うべきですか?
その関数がそこにあって、数式が固定なら WorksheetFunction を使いましょう —
IntelliSense と、捕まえられるエラーが手に入ります。式が実行時に組み立てられるときや、WorksheetFunction が公開してい
ないワークシート関数が必要なときは Evaluate を使います。シート上で存在し再計算されるべき値には、どちらでもなく普通の
セルの数式を使いましょう。
検証環境
検証環境: Excel 365 (Windows 11)、VBA 7.1 — 最終確認 2026-09-27。
関連ガイド: VBA Application.Run · VBA CallByName · VBA WorksheetFunction · VBA Range · VBA On Error · VBA Function · VBA Dictionary
