ExcelのIFとIFSは短絡評価するのか

ExcelのIFとIFSは短絡評価するのか

IF / IFS の未採用分岐、VBA UDF、再計算エンジンの違いを分けて理解する

Copyright © 2026 LWP 山中 一弘

本資料は、出典を明記いただければ、商用・非商用を問わず、ご自由に複製・改変・再配布していただけます。なお、著作権表示は改変せず、そのまま記載してご利用くださいますようお願いいたします。

記事要約

Excelの IF 関数や IFS 関数は、通常のワークシート数式では未採用分岐を値評価しないように動作します。そのため、=IF(A1=0,0,1/A1) のようなゼロ除算回避は、実務上は短絡評価的な使い方として扱えます。

ただし、VBAのユーザー定義関数、つまりUDFが絡む場合は別です。未採用分岐に直接UDFを書いた場合や、未採用分岐が参照するセル範囲に揮発性UDFが入っている場合、返り値としては使われなくてもUDFが再計算対象として呼ばれることがあります。

この記事では、1/0、VLOOKUP、UDF、Application.Volatile の観察結果を分けて、Excelの IF / IFS をどこまで短絡評価として扱えるのかを整理します。中心になるのは、「値評価されない」ことと「再計算エンジン上で一切触れられない」ことは同じではない、という点です。

本記事の対象とゴール

想定読者

  • Excelの IF / IFS でエラー回避をしている人

  • =IF(A1=0,0,1/A1) のような式がなぜ動くのかを説明したい人

  • VBA UDFをワークシート関数の中で使っている人

  • Excelを逐次実行言語ではなく、再計算エンジンとして理解したい人

本記事で得られること

  1. Excelの IF / IFS が通常数式では短絡評価的に使える理由を整理できます。

  2. 1/0 だけでなく、VLOOKUP を含む未採用分岐でも値評価されていないと考えられる理由を確認できます。

  3. UDFが絡むと、未採用分岐でも呼び出される場合がある理由を理解できます。

  4. 「値評価」「依存関係」「再計算」「副作用」を分けて説明できるようになります。

本記事で扱わないこと

  • Excel内部の再計算エンジン仕様を断定すること

  • すべてのExcelバージョンで同じ挙動を保証すること

  • VBA UDFの安全な設計パターンを網羅すること

  • Microsoftドキュメントに書かれていない仕様を公式仕様として扱うこと

最初に結論

Excelの IF / IFS は、通常のワークシート数式については、短絡評価的に使える場面が多いです。未採用分岐に 1/0 を置いても #DIV/0! にならず、VLOOKUP を含む後続分岐でも同じようにエラーが出ないため、未採用分岐の値式は実行されていないと考えるのが自然です。

一方で、これを「未採用分岐にあるものにはExcelが一切触れない」という意味に広げるのは危険です。UDFはExcelから見るとブラックボックスであり、特に Application.Volatile を使ったUDFは再計算対象になりやすくなります。

したがって、実務上の覚え方は次のとおりです。

エラー回避には、IF / IFS の短絡的挙動を使えます。

UDFの副作用回避や重い処理の抑止には、IF / IFS だけに頼らないほうが安全です。

Excelは逐次実行言語ではなく、セル依存関係をもとに動く再計算エンジンです。

短絡評価とは何か

短絡評価とは、結果が確定した時点で残りの式を評価しない評価方式です。

典型例はC言語などの論理演算子です。

c

if (x != 0 && 10 / x > 1) {
/* ... */

}

この場合、x != 0 が偽なら、右側の 10 / x > 1 は評価されません。

なぜなら、&& は左側が偽になった時点で全体の結果が偽に決まるからです。そのため、右側を評価する必要がありません。

この性質を利用すると、ゼロ除算などのエラーを避けることができます。

では、Excelの次の式も同じように考えてよいのでしょうか。

excel
=IF(A1=0,0,1/A1)

A1 が 0 のとき、1/A1 が評価されなければエラーは出ません。この形は実務でもよく使われます。

VBAのIIfとは違う

最初に混同しやすいのが、VBAの IIf 関数です。

VBAには次のような関数があります。

vb
x = IIf(a <> 0, 10 / a, 0)

見た目は条件分岐のようですが、VBAの IIf は通常の関数です。

通常の関数呼び出しでは、関数に渡す引数が先に評価されます。そのため、a = 0 であっても 10 / a が評価され、ゼロ除算エラーになります。

つまり、VBAの IIf は短絡評価しません。

ここはExcelのワークシート関数 IF と大きく違う点です。

Excelの IF は、少なくとも通常のワークシート数式では、採用されない側の値式を評価しないように見えます。

IFの未採用分岐に1/0を置く

まず、もっとも単純な確認です。

excel
=IF(TRUE,1,1/0)

条件は TRUE なので、返る値は 1 です。

もし FALSE 側の 1/0 が値として評価されていれば、結果は #DIV/0! になるはずです。

しかし、実際には 1 が返ります。

逆にしても同じです。

excel
=IF(FALSE,1/0,1)

この式も 1 を返します。

この結果から、少なくともこのケースでは、Excelの IF は未採用分岐を値評価していないと考えられます。

IFSでも同じことが起きる

次に IFS です。

excel
=IFS(TRUE,1,FALSE,1/0)

IFS は、上から条件を見て、最初に TRUE になった条件に対応する値を返します。

この式では最初の条件が TRUE なので、結果は 1 です。

後続の 1/0 が評価されていれば #DIV/0! になるはずですが、実際にはエラーになりません。

このことから、IFS でも、少なくともこのような通常数式では後続の未採用値式が評価されていないと考えられます。

1/0だけでは少し弱い

ただし、1/0 だけで判断するのは少し弱いです。

1/0 は単純な式です。Excelの内部で「これは未採用分岐だから評価しない」という処理をしているのか、それとも単純式として別の最適化が効いているのか、外からは分かりません。

そこで、実行してみないと結果が分からない式を未採用分岐に置きます。

たとえば VLOOKUP です。

excel
=IFS(TRUE,1,TRUE,1/VLOOKUP("a",K5:L5,2,FALSE))

K5:L5 に、検索値 "a" と戻り値 0 を置いておきます。

もし後続分岐が評価されれば、VLOOKUP("a",K5:L5,2,FALSE) は 0 を返します。

すると、式全体では 1/0 になり、#DIV/0! が出るはずです。

しかし、実際の結果は 1 です。

これは重要です。VLOOKUP は実行してみなければ戻り値が分かりません。それでも #DIV/0! が出ないということは、後続分岐の 1/VLOOKUP(...) 全体が値評価されていない可能性が高いと考えられます。

つまり、単なる 1/0 の定数的な省略ではなく、IFS の未採用分岐そのものが値評価されていないと見るほうが自然です。

ここまでは短絡評価的に見える

ここまでの結果を整理すると、次のようになります。

  • IF の未採用側に 1/0 を置いた =IF(TRUE,1,1/0) は 1 を返します。未採用側は値評価されていないと考えられます。

  • IF の逆方向である =IF(FALSE,1/0,1) も 1 を返します。逆方向でも未採用側は値評価されていないと考えられます。

  • IFS の後続値に 1/0 を置いた =IFS(TRUE,1,FALSE,1/0) も 1 を返します。後続値式は値評価されていないと考えられます。

  • IFS の後続分岐に VLOOKUP を置いた =IFS(TRUE,1,TRUE,1/VLOOKUP(...)) も 1 を返します。後続分岐全体が値評価されていない可能性が高いと考えられます.

この範囲だけを見るなら、Excelの IF / IFS は短絡評価している、と言いたくなります。

実務上も、通常のワークシート数式についてはその理解で困らない場面が多いです。

しかし、ここで話を終えると危険です。

ExcelはC言語のような逐次実行言語ではありません。Excelはセルの依存関係を持ち、ワークシート全体を再計算する計算エンジンです。

その違いが、UDFで表に出ます。

UDFを使うと話が変わる

VBAで、呼ばれたことを確認できるUDFを用意します。

vb
Public Function Probe(ByVal label As String, ByVal v As Variant) As Variant
Application.Volatile True
Debug.Print Now, label
Probe = v
End Function

この関数は、呼ばれるとイミディエイトウィンドウに時刻とラベルを出します。

これを未採用分岐に置きます。

excel
=IF(TRUE,1,Probe("B",2))

または、

excel
=IFS(TRUE,1,TRUE,Probe("B",2))

通常数式だけで考えるなら、未採用分岐の Probe("B",2) は呼ばれないように思えます。

ところが、UDFを使うと、未採用分岐であっても Debug.Print が実行されるケースがあります。

つまり、次の2つは別の話です。

text

未採用分岐の値が返り値として使われない

text

未採用分岐に含まれるUDFが絶対に呼ばれない

Excelでは、前者は成り立つように見えても、後者までは保証できません。

Application.Volatileの影響

UDFでよく出てくるのが Application.Volatile です。

vb
Public Function zerozero()
Application.Volatile True
Debug.Print "zerozero"
zerozero = 0
End Function

Application.Volatile True を指定したUDFは、ワークシートの再計算時に再計算対象になりやすくなります。

Microsoft Learnでも、Application.Volatile はユーザー定義関数を自動再計算関数にするメソッドとして説明されています。

ここが通常のワークシート関数との違いです。

Excelの組み込み関数や演算子だけで構成された式なら、Excelの計算エンジンはかなり細かく意味を把握できます。

しかし、VBAのUDFはExcelから見るとブラックボックスです。

そのUDFが副作用を持つのか、外部状態に依存するのか、どのセルを参照するのか、Excelが完全に把握できるわけではありません。

そのため、依存関係管理や再計算管理の都合で、未採用分岐に見える場所のUDFが呼ばれることがあります。

参照先セルのUDFも別に動く

さらにややこしいのは、未採用分岐の中にUDFを直接書いていない場合です。

たとえば、VLOOKUP の参照範囲にUDFが入っているとします。

参照先セルに次の式を入れます。

excel

=zerozero()

そのうえで、次の式を評価します。

excel
=IFS(TRUE,1,TRUE,1/VLOOKUP("a",K5:L5,2,FALSE))

この式の結果は 1 です。#DIV/0! は出ません。

つまり、IFS の後続分岐にある 1/VLOOKUP(...) は値としては評価されていないと考えられます。

しかし、参照範囲内のセルにある zerozero() は、ワークシート上の独立したセルとして再計算されることがあります。

ここで分けるべきなのは、次の2つです。

text

IFSの後続分岐を、返り値を得るために値評価するか

text

ワークシート上の別セルにあるUDFが、再計算対象として実行されるか

この2つは同じではありません。

未採用分岐が値評価されないことと、参照先セルのUDFが再計算されることは両立します。

「評価される」の意味を分ける

今回の話では、「評価される」という言葉を分けて考える必要があります。

まず、値評価です。

これは、式の結果値を得るためにその式を実行することです。

たとえば、次の式が実際に計算されるかどうかです。

excel

1/VLOOKUP(...)

次に、依存関係の解析です。

Excelは、どのセルがどのセルに依存しているかを管理します。そのため、式中の参照や関数を依存関係グラフとして把握します。

さらに、再計算評価があります。

これは、ワークシートの再計算対象としてセルやUDFが実行されることです。

最後に、副作用の観測があります。

UDFの Debug.Print のように、返り値以外の動作が見える場合です。

通常のExcel関数だけなら、これらをあまり意識しなくても済みます。

しかしUDFを使うと、「値として採用されていないのに、関数は呼ばれている」という状況が起きます。

そのため、Excelの IF / IFS を語るときは、何を評価と呼んでいるのかをはっきりさせる必要があります。

IFとIFSは短絡演算子なのか

厳密には、Excelの IF / IFS をC言語の && や || と同じ意味の短絡演算子と呼ぶのは危険です。

理由は、UDFが絡むと未採用分岐でも呼ばれるケースがあるからです。

一方で、通常のワークシート数式については、IF / IFS は短絡評価的に動作していると考えてよい場面が多いです。

次のような式は、実務上かなり自然な使い方です。

excel
=IF(A1=0,0,1/A1)
excel
=IFS(A1=0,0,TRUE,1/A1)

A1 が 0 のとき、後続の 1/A1 が値評価されないため、ゼロ除算を避けられます。

この意味では、Excelの IF / IFS は、通常数式のエラー回避には短絡評価的に使えます。

ただし、次のような期待はしないほうが安全です。

excel
=IF(FALSE,HeavyUDF(),0)
excel
=IFS(TRUE,0,TRUE,HeavyUDF())

この形で、HeavyUDF() が絶対に呼ばれないと期待するのは危険です。

UDFの副作用を避けたい、重い処理を確実に止めたい、外部アクセスを抑止したい、という目的なら、IF / IFS の未採用分岐に置くだけでは不十分です。

UDF側で条件を受け取り、UDFの内部で処理を分けるなど、別の設計を考える必要があります。

ドキュメントから読み取れること

Microsoft Supportの IF 関数の説明は、条件が真の場合にある値を返し、偽の場合に別の値を返す、という内容です。

IFS 関数の説明も、1つ以上の条件を確認し、最初の TRUE 条件に対応する値を返す、という内容です。

ここから分かるのは、どの値が返るかです。

一方で、今回問題にしているのは、返らない候補式をどこまで評価するか、UDFを呼ぶか、参照先セルを再計算するか、という話です。

これは通常の関数説明よりも一段低い、Excelの再計算エンジンの話になります。

そのため、ドキュメントだけから「未採用分岐は一切評価されない」とまでは読み取らないほうがよいです。

実務での覚え方

実務では、次のように覚えるのが安全です。

通常のワークシート数式では、IF / IFS は短絡評価的に動作します。

そのため、ゼロ除算や不要なエラーを避ける目的では、次のような式は妥当です。

excel
=IF(A1=0,0,1/A1)
excel
=IFS(A1=0,0,TRUE,1/A1)

ただし、UDFの呼び出し抑止には使わないほうが安全です。

未採用分岐に直接UDFが入っている場合だけでなく、未採用分岐が参照するセル範囲にUDFが入っている場合も注意が必要です。

特に Application.Volatile を使ったUDFは、ワークシート再計算の影響を受けやすくなります。

つまり、Excelの IF / IFS は、通常数式の値評価については短絡評価的に動く。

しかし、Excel全体は逐次実行言語ではなく、依存関係グラフを持つ再計算エンジンである。

この2つを分けて理解するのが大事です。

まとめ

Excelの IF / IFS は、通常のワークシート数式については、未採用分岐を値評価しないように動作していると考えられます。

1/0 だけでなく、VLOOKUP を含む後続分岐でも #DIV/0! が発生しないため、単なる定数式の省略ではなく、分岐全体の値評価が省略されている可能性が高いです。

一方で、UDFが絡むと話は変わります。

未採用分岐であってもUDFが呼ばれることがあります。さらに、未採用分岐の参照先セルにあるUDFが、ワークシートの再計算対象として実行されることもあります。

したがって、結論は次のように整理できます。

text

ExcelのIF / IFSは、通常数式では短絡評価的に使える。

ただし、UDFを含む未採用分岐に一切触れないことが保証された、

言語仕様上の短絡演算子とまでは言い切れない。

エラー回避には使える。

UDFの副作用回避や重い処理の抑止には使わない。

Excelは、セルの依存関係をもとに動く再計算エンジンである。

この理解で分けておくと、IF / IFS の挙動を実務で誤解しにくくなります。

出典・確認範囲

この記事は、元ネタMarkdown excel_if_ifs_short_circuit_analysis_detailed.md に含まれていた検証メモをもとに、LWP公開記事用に再構成したものです。

Microsoft Supportの IF / IFS の説明から確認できるのは、主に「どの値を返すか」です。未採用分岐の式、UDF、参照先セルの再計算がどこまで抑止されるかを明示的に保証する記述としては扱っていません。

UDFと Application.Volatile については、Microsoft Learnの説明と、元ネタ内の観察結果を分けて扱っています。Excel内部仕様の断定ではなく、実務上の安全な理解として整理しています。

参考リンク

  • Microsoft Support: IFS function

https://support.microsoft.com/en-us/office/ifs-function-36329a26-37b2-467c-972b-4a39bd951d45

  • Microsoft Support: IF function

https://support.microsoft.com/en-us/office/if-function-69aed7c9-4e8a-4755-a9bc-aa8bbff73be2

  • Microsoft Learn: Application.Volatile method

https://learn.microsoft.com/ja-jp/office/vba/api/excel.application.volatile