AccessのIIf関数の使い方をお探しですね。
広告
AccessのIIf関数を使いこなそう!条件分岐の基本から実践まで
Accessでクエリやフォームを作っていると、「金額が一定以上なら高額」「納期を過ぎていたら遅延」「点数によって評価を変える」といった条件分岐を入れたい場面がよくありますよね。
そんなときに便利なのが**IIf関数**です。
ExcelのIF関数に似ているので、考え方は理解しやすいと思います。
ただし、Access特有の**Nullの扱い**や、クエリでの書き方、複数条件を入れ子にしたときの読みづらさ、True側とFalse側の両方が評価されてしまう注意点など、知らないとエラーにつながるポイントもあります。
この記事では、AccessのIIf関数の基本的な使い方から、複数条件の分岐、ExcelのIF関数との違い、実務で安全に使うためのコツまでを、初心者の方にも分かりやすく解説していきます。
AccessのIIf関数って何?基本的な使い方
AccessのIIf関数は、条件式の結果によって返す値を切り替えるための関数です。
読み方は「**アイ・アイ・エフ**」。
「もし条件を満たすならA、満たさないならBを返す」という処理を1つの式で書けるんです。
ExcelのIF関数に慣れている方なら、考え方はほとんど同じなのですぐに理解できると思います。
ただし、Accessでは関数名が「IF」ではなく「**IIf**」になる点に注意してください。
Excelと同じ感覚で `IF(…)` と入力するとエラーになってしまいます。
基本的な書き方はこんな感じです。
“`text
IIf(条件式, 真の場合の値, 偽の場合の値)
“`
たとえば、点数が80点以上なら「合格」、それ以外なら「不合格」と表示したい場合は、次のように書きます。
“`text
IIf([点数]>=80, “合格”, “不合格”)
“`
ここで `[点数]>=80` が条件式、`”合格”` が条件を満たしたときの値、`”不合格”` が条件を満たさなかったときの値です。
Accessのクエリでは、**フィールド名を角カッコ `[]` で囲む**のが基本ルールです。
文字列を返す場合はダブルクォーテーション `”` で囲み、数値を返す場合は囲まずに書きます。
この区別があいまいだと、Accessが文字列をフィールド名やパラメーターだと勘違いしてしまい、意図しない入力画面が表示されることがあるので注意しましょう。
IIf関数は、いろんな場所で使えます。
– クエリの演算フィールド
– フォームのテキストボックス
– レポートのコントロールソース
– VBA内の式
たとえばクエリで「納期ステータス」という列を追加したい場合は、クエリデザインのフィールド欄に次のように入力します。
“`text IIf関数は単純な二択だけでなく、複数の条件を組み合わせた判定にも使えます。 たとえば「売上が10,000円以上、**かつ**顧客ランクがAなら優遇」としたい場合は、条件式の中で `And` を使います。 `And` は複数の条件が**すべて満たされたとき**にTrueになる演算子です。 一方で、**どちらか一方でも満たせばよい**場合は `Or` を使います。 “`text この式では、売上が10,000円以上で、**さらに**顧客ランクがAのときだけ「優遇」と表示されます。 どちらか片方の条件だけでよい場合は、次のように書きます。 “`text 複数条件を使うときは、**条件のまとまりが分かるようにカッコを使う**と読みやすくなります。 たとえば「売上が10,000円以上かランクAで、かつ未入金ではない」という条件なら、次のように書けます。 “`text Accessでは `<>` が「等しくない」という意味です。 条件式が長くなるほど、どの条件がどこにかかっているのか分かりにくくなるので、カッコで優先順位を明示することが大切です。 後から自分で見直す場合はもちろん、他の人が修正する可能性がある業務データベースでは、式の読みやすさが保守性に直結しますからね。 3通り以上に分岐したい場合は、IIf関数の中にさらにIIf関数を入れる「**入れ子**」(ネスト)を使います。 たとえば点数に応じて「優」「良」「可」「不可」を表示したい場合は、次のように書けます。 “`text この式は、まず80点以上かどうかを判定し、該当しない場合に60点以上かどうか、さらに該当しない場合に40点以上かどうかを判定します。 評価のように範囲で分ける場合は、**条件の順番が非常に重要**です。 上の例では「80点以上」→「60点以上」→「40点以上」のように、厳しい条件から順に並べています。 もし「40点以上」を先に書いてしまうと、80点の人も40点以上に該当してしまい、本来の評価になりません。 入れ子は便利ですが、深くしすぎると式が長くなり、カッコの閉じ忘れや条件順のミスが起きやすくなります。 実務では、**IIf関数の入れ子は2〜3段階程度まで**に抑えるのが扱いやすい目安です。 分岐が4つ以上になったり、条件が複雑になったりする場合は、Switch関数や別クエリでの分割、VBAのIfステートメントやSelect Caseの利用も検討するといいでしょう。 AccessのIIf関数とExcelのIF関数は、どちらも「条件式、真の場合、偽の場合」という順番で書くので、基本的な考え方は似ています。 Excelでは `=IF(A1>=80,”合格”,”不合格”)` と書きますが、Accessでは `IIf([点数]>=80,”合格”,”不合格”)` のように書きます。 大きな違いは次の3つです。 1. 関数名が違う(IF → IIf) Excelの空白セルとAccessのNullは似ているようで同じではありません。 **Null**とは、「値が存在しない状態」を表します。 Accessでは、空文字 `””` とNullは別物です。 そのため、備考欄が未入力かどうかを判定したいときに、単純に `[備考]=””` と書いても、Nullのレコードを正しく判定できない場合があります。 Nullを判定するには、`IsNull` 関数を使うのが基本です。 “`text この式では、備考がNullなら「未入力」と表示し、Nullでなければ備考の内容をそのまま表示します。 ただし、実務では**Nullを別の値に置き換える**目的であれば、`Nz` 関数を使ったほうが簡潔な場合もあります。 たとえば備考がNullなら「未入力」としたいだけなら、次のように書けます。 “`text 数値計算でもNullは要注意です。 たとえば `[数量]*[単価]` のような計算で、どちらかがNullだと結果もNullになることがあります。 計算結果を0として扱いたい場合は、`Nz([数量],0)*Nz([単価],0)` のようにNullを0に置き換えてから計算する方法が有効です。 IIf関数だけで何でも処理しようとせず、**Null対策ではIsNullやNzを組み合わせる**と、式が分かりやすく安全になります。 もう1つ重要なのが、**AccessのIIf関数はTrue側とFalse側の式を両方評価する**という点です。 これはExcelのIF関数と同じ感覚で使っていると見落としやすい注意点です。 たとえば、分母が0でなければ割り算し、0なら0を返したいと考えて次のように書いたとします。 “`text 一見すると、数量が0の場合はFalse側の0が返るので問題ないように見えますよね。 しかしAccessのIIf関数では、条件の結果に関係なく `[金額]/[数量]` 側も評価されるため、**数量が0のレコードで「0で除算しました」というエラーが発生**することがあるんです。 このようなケースでは、次のような対策が必要です。 – 事前に数量が0のデータを除外する IIf関数だけに頼らない設計が必要になります。 Excelとの違いを整理すると、Accessでは**データベースとして複数レコードに式を適用する**ため、データ型、Null、フィールド名、評価順の影響が大きくなります。 Excelでは1つのセルを見ながら修正できますが、Accessのクエリでは多数のレコードに一括で式が適用されます。 そのため、数件のサンプルで動いても、**NullNullや0を含むレコードが混ざった瞬間にエラーになる**ことがあります。 IIf関数を使うときは、「通常の値」「Null」「0」「空文字」のような例外データも想定して式を作ることが大切です。 IIf関数は、業務データの状態を分かりやすく表示する場面で特に役立ちます。 請求管理では、入金日がNullなら「未入金」、入金日が入っていれば「入金済」と表示できます。 “`text 在庫管理では、在庫数が0以下なら「発注必要」、それ以外なら「在庫あり」と表示できます。 “`text 日付を使った判定もよく使われます。 たとえば契約終了日が今日より前なら「終了」、今日以降なら「有効」と表示する場合は、次のように書きます。 “`text IIf関数は「**表示用の判定**」に向いています。 一方で、複数の処理を実行したい場合や、条件ごとに別々のアクションを行いたい場合は、VBAのIfステートメントのほうが適しています。 IIf関数はあくまで値を返す関数であり、複雑な処理の流れを制御する構文ではありません。 – **クエリやフォームで短い判定結果を表示する**→ IIf この使い分けを意識すると設計しやすくなります。 分岐が多い場合は、**Switch関数**も選択肢になります。 Switch関数は、複数の条件と結果を順番に並べ、最初にTrueになった条件の値を返す関数です。 IIf関数の入れ子よりも平らな構造で書けるので、条件が増えたときに読みやすくなります。 “`text 最後に `True, “不可”` と書くことで、どの条件にも当てはまらない場合の結果を指定できます。 評価やランク分けのように複数段階へ分類する処理では、IIfの入れ子よりSwitchのほうが保守しやすい場合があります。 ただし、二択の単純な判定であればIIf関数のほうが短く分かりやすいので、無理にSwitchへ置き換える必要はありません。 IIf関数を安定して使うためのポイントをまとめます。 1. **式を短く保つ**(入れ子は2〜3段階まで) 特に、次の点は実務でのトラブル防止に直結します。 – 文字列はダブルクォーテーション `”` で囲む IIf関数はAccessの条件分岐で最も使いやすい関数の1つですが、万能ではありません。 – **単純な判定**→ IIf このように使い分けることで、読みやすくエラーに強いAccessデータベースを作れます。 最初は少し難しく感じるかもしれませんが、実際に使ってみると意外とすぐに慣れますよ。 ぜひ実務で活用してみてください! 広告
納期ステータス: IIf([納期]
IIf([売上]>=10000 And [顧客ランク]=”A”, “優遇”, “通常”)
“`
IIf([売上]>=10000 Or [顧客ランク]=”A”, “確認対象”, “通常”)
“`
IIf(([売上]>=10000 Or [顧客ランク]=”A”) And [入金状況]<>“未入金”, “処理可”, “要確認”)
“`3つ以上に分岐したいときは「入れ子」
IIf([点数]>=80, “優”, IIf([点数]>=60, “良”, IIf([点数]>=40, “可”, “不可”)))
“`ExcelのIF関数との違いに注意!
2. フィールド名を角カッコで囲む
3. **Nullの扱いに注意が必要**Nullって何?どう扱えばいい?
IIf(IsNull([備考]), “未入力”, [備考])
“`
Nz([備考], “未入力”)
“`重要!True側もFalse側も両方評価される
IIf([数量]<>0, [金額]/[数量], 0)
“`
– 別クエリで安全な分母を作る
– VBAでIfステートメントを使うExcelとの違いまとめ
実務で使えるIIf関数の例
入金状況の判定
入金状況: IIf(IsNull([入金日]), “未入金”, “入金済”)
“`在庫の判定
在庫判定: IIf([在庫数]<=0, "発注必要", "在庫あり")
```
テーブルにステータス列を持たせなくても、クエリやフォーム上で動的に判定できるので、データの重複や更新漏れを防ぎやすくなります。
日付を使った判定
契約状態: IIf([契約終了日]
– **VBAで複数行の処理を分岐する**→ Ifステートメント分岐が多いときはSwitch関数も選択肢に
Switch([点数]>=80, “優”, [点数]>=60, “良”, [点数]>=40, “可”, True, “不可”)
“`まとめ:IIf関数を安全に使うためのポイント
2. **例外データを想定する**(Null、0、空文字など)
3. **用途に合った関数へ切り替える**(Switch、VBAなど)
– フィールド名は角カッコ `[]` で囲む
– Null判定には`IsNull`や`Nz`を使う
– 0除算が起きる式をIIf内に安易に入れない
– **複数段階の分類**→ Switch
– **処理そのものを分ける**→ VBAのIfステートメントやSelect Case
