• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ACCESS IIF関数 複数条件の設定について)

ACCESS IIF関数 複数条件の設定について

このQ&Aのポイント
  • ACCESSで複数条件の設定をする際、IIF関数を使用します。指定したフィールドの値に応じて、別のフィールドの値を設定することができます。
  • 例えば、フィールド「X」の値が0<[X]<=50であれば「A」、50<[X]<=100であれば「B」、100<[X]<=150であれば「C」と表記させるフィールド「Y」を追加したい場合、IIf(0<[X]<=50, 'A', IIf(50<[X]<=100, 'B', IIf(100<[X]<=150, 'C', '')))のような数式を使用します。
  • しかし、実行すると、Yの列がすべて「-1」と表記されてしまいます。この問題は、IIF関数の条件式が正しくないため起こる可能性があります。条件式を確認し、適切な条件式を使用するようにしましょう。

質問者が選んだベストアンサー

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.2

a)IIF関数で対応する場合:  IIF関数の第2引数または第3引数に、IIF関数を入れ子とする必要があります。 式: IIF([X]<=0, "", IIF([X]<=50, "A", IIF([X]<=100, "B", IIF([X]<=150, "C", "")))) b)別の組込関数を使用する場合:  IIF関数は二択ですので入れ子にする必要がありますが、Accessのクエリで  使用できる、似た機能の関数に、Switch関数というものもあります。  これであれば、入れ子にする必要がなくなります。  (詳しくは、Accessのヘルプを参照下さい) 式: Switch([X]<=0, "", [X]<=50, "A", [X]<=100, "B", [X]<=150, "C", True, "") なお、数学あるいは一般生活では確かに「0<[X]<=50」という表記をしますが、 Accessの関数などではこれだと正しい結果が得られません。 正しく認識させるためには、等号・不等号を挟んだ式は、「左辺」と「右辺」の 2つの要素からなる形にする必要があります。 (「0<[X]<=50」は「[X]>0 And [X]>=50」と分割してやる、と) 但し、今回のご質問のような『連続した範囲』であれば、前(左)で既出となる 式の要素で「[X]<=0」が「真(=-1)」とならなかった時点で、「[X]>0」が保証 されますので、上記のように、「[X]>0」を省略して「[X]<=50」だけを条件として 指定すればOk、ということになります。 (「0<[X]<=50」の次が「80<[X]<120」などのように、「50~80」が欠けた  場合は、省略ができない、と) 【参考】 「0<[X]<=50」は、このままだと「0 < ([X]<=50)」という式と解釈されます。 この場合、「[X]<=50」は、「真(=-1)」か「偽(=0)」か「Null」のいずれかに なります。 何にせよ、「0<[X]<=50」全体として「正(=-1)」となることがないため、 ご質問の式では、IIF関数は常に第3引数に指定された値「""」を返す ことになります。 この結果、式全体としては「"" Or "" Or ""」という形となり、「0かNull」 以外なので、「真(=-1)」という値が返された、ということです。 なお、Nullについては、以前、他の方の質問につけた回答も、併せて参考までに: http://okwave.jp/qa/q4850675.html

bambu3340
質問者

お礼

ご回答ありがとうございました。 0<[X]<=50 とはしないんですね。 またSwitch関数の活用方法についても勉強になりました。 大変ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (1)

noname#212067
noname#212067
回答No.1

はじめまして、こんにちは IIf(0<[X]<=50,"A","") Or IIf(50<[X]<=100,"B","") Or IIf(100<[X]<=150,"C","") この式で、何故「-1」になるかの説明をすると各判定を全て説明しなくてはならなくなるので 省略します。 Iifでやるとしたら IIf((0<[X]) And ([X]<=50),"A",IIf((50<[X]) And ([X]<=100),"B",IIf((100<[X]) And ([X]<=150),"C","")))となります しかし、クエリーのフィールドの部分に 長い式を入れるのは、見にくくなりますし編集もしにくいです。 そこで、モジュールを作成し、ユーザー定義関数を作成します。 ユーザー定義関数は自分で任意の結果を返す関数を作成することが出来ます。 たとえばモジュール名はUserFunctionModuleとし その中にCOMPと言う関数を定義します COMP関数の中身は以下のように定義します。 Function comp(X As Long) As String ’ユーザー定義関数宣言 X は数値型で宣言 COMPは文字型で宣言 comp = "" ’わかりやすく初期化 If (0 < X) And (X <= 50) Then comp = "A" ’Aを返す End If If (50 < X) And (X <= 100) Then comp = "B" ’Bを返す End If If (100 < X) And (X <= 150) Then comp = "C" ’Cを返す End If   ’どの条件にも当てはまらない場合は、""を返します。 End Function クエリーでは「Y:COMP(X)」で、呼び出して使用することが出来ます。 参考までに

bambu3340
質問者

お礼

ご回答ありがとうございました。 また、モジュールの件も参考になります。 確かに、長くなるのは不便なので活用させていただきます。 大変助かりました!

すると、全ての回答が全文表示されます。

関連するQ&A