🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

Excel VBA の Evaluate — 数式の文字列を値に変える

|

Excel VBA の Evaluate — 数式の文字列を値に変える

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