ママのスキンケアのお悩みにおすすめアイテム

Accessについて、教えてください。

クエリで抽出しているときに、フィールド1とフィールド2の数値を掛け算した値をフィールド3に表示したいと思っています。(小数点1位まで表示)
フィールド1とフィールド2は値がnullの場合もありますが、この場合は「0」として扱うのではなく、そのまま計算結果もnullにしたいと思っています。

最初は単純に

フィールド3: ROUNDMS2(ROUNDMS([フィールド1],1)*ROUNDMS([フィールド2],1),1)

とクエリに表記したのですが、この場合「フィールド1」や「フィールド2」がnullの場合は#ERRORが表示されました。

次に、IFでフィールド1やフィールド2がnullの場合は計算せずにnullをかえしてもらおうと下記のような文をつくりました。

フィールド3: IIf([フィールド1]=Null,Null,IIf([フィールド2]=Null,Null,ROUNDMS2(ROUNDMS([フィールド1],1)*ROUNDMS([フィールド2],1),1)))

これでもやっぱり#ERRORが表示されます。


いろいろと検索したのですが、nullを0として扱う例は多数見つけられましたがnullのまま扱う例が見つけられませんでした。

勘違いしているところがあるかもしれませんが、アドバイスよろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (6件)

また#1です。


Nullの判定はIsNull関数でないとできないかも。
    • good
    • 1
この回答へのお礼

アドバイスありがとうございます。
NO.1~NO.3へのまとめてのお礼で申し訳ないです。

=nullではなく、IsNullで一度やってみます。
No.2ですが、Nullというのはまったくデータがない状態なので空文字も同じことだと認識していたんですが、ちょっと違うんでしょうか??
データが入っているものとないものがあり、はいっている場合は計算してない場合は空欄で表示したかっただけなんです。

お礼日時:2006/03/16 10:17

>値がnullの場合もありますが、この場合は「0」として扱うのではなく、そのまま計算結果もnullにしたい



演算子を使用して式の中の1つのフィールドの値がNullである場合は式全体の結果がNull値になりますのでNullしか返りません。
フィールド3:ROUND(ROUND([フィールド1],1)*ROUND([フィールド2],1),1)
で普通に演算できます。NullのフィールドがあるレコードはNullのまま返ります。


>フィールド3: ROUNDMS2(ROUNDMS・・・この場合「フィールド1」や「フィールド2」がnullの場合は#ERRORが表示

Accessの関数やスカラー関数にもROUNDMS2やROUNDMSという関数はありません。ROUNDMS2などをユーザー定義関数として作成して使用しているのであればPublic Functionに記述した定義に誤りがありエラー表示しているのではないでしょうか。Nullがあった場合の処理の記述がないとか。
    • good
    • 0
この回答へのお礼

アドバイスありがとうございます。
関数がおかしかったのでしょうか。
前任者から引き継いだものを修正しているので実はよくわからず、「ROUND」などと同じ種類の関数だと思っていました。
ありがとうございました。

お礼日時:2006/03/16 20:48

Nullと空文字は見た目では判断できませんが


プログラム上では扱いが違います。
下記でどうでしょう。
ちなみに四捨五入は計算結果に行うだけでいいのでは。
---
フィールド3: IIf(Nz([フィールド1],"")="" or Nz([フィールド2],"")="","",round([フィールド1]*[フィールド2],1))
    • good
    • 1
この回答へのお礼

再度のアドバイス、ありがとうございます。
プログラム上では扱いが違うんですか!!!知りませんでした!!
同じものだと思ってました!!
先ほど、=nullではなく、IsNullにしてみたところ、できました!!!
ありがとうございました。

お礼日時:2006/03/16 20:48

こんにちは。



同じ様にクエリを作ってみました。
フィールド3はちゃんとNull値になりました。

ROUNDMS関数がよくわからなかったのですが(未定義関数でエラーになった)、普通のRound関数であれば、まったく問題なかったです。
    • good
    • 1
この回答へのお礼

ありがとうございます。
この式で#Error表示されなかったということでしょうか?

私のAccessでは#Errorになるのですが、何か別の問題なんでしょうか・・・

お礼日時:2006/03/16 10:18

#1です。


ところでフィールド1、フィールド2はNullですか?
空文字("")ではないですか。
    • good
    • 0

IIFでの判定条件を


[フィールド1]=Null OR [フィールド2]=Null
とすればいいのでは。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QACCESSで空白のデーターをクエリで判定/識別する方法を教えてくださ

ACCESSで空白のデーターをクエリで判定/識別する方法を教えてください。
EXCELでは空白を""で判定/識別表していますがACCESSではどうなるのでしょうか。

下の例はフィールドに試験番号があればその番号を、空白なら”欠席”と表示しようとしています。
IIf(([試験番号]="空白の場合何を入れる?"),[試験番号],"欠席")

Aベストアンサー

もうひとつの書き方は
式1: IIf([試験番号] Is Not Null,[試験番号],"欠席")
第2、第3引数の、質問の順序にあわせるとこうなる。

Qアクセスで#エラーを表示させない方法は?

アクセス2000を使用しています。フォームにテキストボックスを貼り付けて、計算式を入れています。計算できない数値になると、#エラーと表示されます。目障りなので、#エラー という表示を消したいのですが、どうしたらよろしいでしょうか?宜しくお願い申し上げ候。

Aベストアンサー

はじめは「IIF関数とIsError関数を使用して」と考えたものの、IIF関数は引数がエラーになった時点で
エラーが返されてしまう(=元の木阿弥)ので、どうしたものかと思ったのですが・・・
とりあえず、「見た感じ、何も表示されていないように見える」ということで、『条件付書式』での対応と
いうのはいかがでしょうか。

1)当該フォームをデザインビューで開く
2)当該テキストボックスを選択
3)メニューで「書式(O)→条件付き書式(D)」を選択
4)『条件付き書式設定』ダイアログが開くので、『条件1(1)』枠の左端にあるコンボボックスで「式」を選択
5)上記コンボボックスの隣が1つのテキストボックスになるので、そこに以下のような式を入力
 IsError([テキスト0])
 ※上記の式は当該テキストボックスの名前が「テキスト0」の場合です。
6)上記テキストボックスの下、右から2番目に「A」と表示された、文字色を指定するボタンがあるので、
 その左の小さな「▼」をクリックし、当該テキストボックスの背景と同じ色(既定では白のはず)を選択
7)『OK』ボタンをクリックしてダイアログを閉じる

・・・以上です。
これで、『テキスト0』の計算式がエラーになった場合は、文字色が背景と同じ色になるので、「#エラー」と
いう表示はされていないように見える、という状態にすることができると思います。

はじめは「IIF関数とIsError関数を使用して」と考えたものの、IIF関数は引数がエラーになった時点で
エラーが返されてしまう(=元の木阿弥)ので、どうしたものかと思ったのですが・・・
とりあえず、「見た感じ、何も表示されていないように見える」ということで、『条件付書式』での対応と
いうのはいかがでしょうか。

1)当該フォームをデザインビューで開く
2)当該テキストボックスを選択
3)メニューで「書式(O)→条件付き書式(D)」を選択
4)『条件付き書式設定』ダイアログが開くので、『条件1(1)』枠の...続きを読む

QIIF関数の使い方

NULL以外のときはTRUENULLのときはFALSEと返したいのですがどうすればいいのでしょうか?

変数=IIF(列名<>NULL,"TRUE","FALSE")

これだとすべてFALSEが返ってきてうまくできませんでした。(列名がNULLでないものも)

NULLかどうかの評価はどうすればいいのでしょうか?

Aベストアンサー

#1の方の回答は逆ですな。
>NULL以外のときはTRUE
ですから、
IIf(Not(IsNull([列名])),"TRUE","FALSE")
または
IIf(IsNull([列名]),"FALSE","TRUE")
となります。

そして、Visual Basicカテゴリなので、IsNull関数が出てきていますが、お話の様子では、Excelのようですので、IsNull関数はありませんね。
Excelでは、ISBLANK関数を使います。
IIF(ISBLANK([列名]),"FALSE","TRUE")

補足のように、
IIF(列名<>"","TRUE","FALSE")
でもよいのですが……。

また、予約語のTrueやFalse(#1さんの回答にある値が-1,0になるモノ)を返せばよいのであれば、
変数=NOT(ISBLANK([列名]))
とか
変数=([列名]<>"")
で十分です。

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

 選択クエリにおいて、あるフィールド「 X」 のレコード数値が
 
  0<[X]<=50   であれば A 
  50<[X]<=100  であれば B 
  100<[X]<=150  であれば C

 と表記させるフィールド「Y」を追加したいと考えています。
 この場合、Yのフィールド設定で指定する数式についてご教授願います。

 一応、
  IIf(0<[X]<=50,"A","") Or IIf(50<[X]<=100,"B","") Or IIf(100<[X]<=150,"C","")

  としましたが、実行すると、Yの列がすべて「-1」と表記されてしまいます。

 何卒よろしくお願いいたします。

Aベストアンサー

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://oshiete.goo.ne.jp/qa/4850675.html

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"...続きを読む

Qアクセス エラーを数値「0」に変換するには

こんばんは。
テーブル1のフィールド1を、テキスト型にし
1
2
3

と入力しました。

クエリを作成し、
SELECT CLng([テーブル1]![フィールド1]) AS 数値に変換
FROM テーブル1;
とした場合、
「あ」の部分が数値に変換できないため、「#エラー」となります。

このままだと、並べ替えをしようとすると

「抽出条件でデータ型が一致しません。(Error 3464)」

となるため、「#エラー」を0へ変換したいのですが、
やり方がわかりません。
IIFなどを使うのでしょうか?
ご教授よろしくお願い致します。

Aベストアンサー

> IIFなどを使うのでしょうか?

そうですね。
IsNumeric関数で数値かどうかを判定し、数値ならCLng関数で変換、
それ以外は0、とすることになるかと思います。

SELECT IIf(IsNumeric([テーブル1].[フィールド1]),CLng([テーブル1].[フィールド1]),0) AS 数値に変換
FROM テーブル1;

なお、IIF関数では、第1引数の結果がTrue/Falseのいずれであっても
第2引数・第3引数は一旦演算されます。
そのため、以下のような式にした場合は、結局エラーとなります。
(フィールド1が「あ」の場合、第3引数の式CLng(~)がエラーとなるため、
 式全体の結果もエラーを返す、と)

SELECT IIf(IsError(CLng([テーブル1].[フィールド1])),0,CLng([テーブル1].[フィールド1])) AS 数値に変換
FROM テーブル1;

QアクセスVBAのMe!と[ ]

基本的なことですみません。

アクセスのイベントプロシージャで、Me!ってありますけど、これはどういう意味なんでしょうか?

また、Me!の後に、Me!.~~と書く場合と、Me!.[~~]と書く場合がありますが、どこが違うのでしょうか?

Aベストアンサー

>プロシージャ内で[]を使う場合は、そのフォーム外のオブジェクトを使う場合と考えてよろしいでしょうか?
別のオブジェクトを使う場合だけではありません。
Hensu = Me![Text1]のようにHensuという変数に自身のTest1の値を代入する場合のように。
[]で括られているのがオブジェクト名やコントロール名だよという事。
クエリの抽出条件に存在しない[?]とすれば?というコントロール等が参照できないので?というダイアログが表示されるように?というオブジェクトやコントロールは何?と聞いてくるように。
>フォーム内のオブジェクトの場合はあくまでMe!で良いのでしょうか
Forms.[フォーム名]![コントロール名]やForms![フォーム名]![コントロール名]が構文。
アクティブなフォームが自分自身ならForms![フォーム名]の変わりにMeでもOKですという事。

と言う解釈の方が良いと思います。

Qアクセスのクエリで空白を0として計算したい

アクセスのクエリで1・2列目に数値データを入れておき、3列目で合計を表示させたいのですが、1・2列目に空白セルがある場合には0(ゼロ)として計算したいのです。(データが空白だと、3列目も空白になってしまいます。)

1列目 2列目 3列目(合計)
 3   2   5
(空白)  2  (空白) ←これを2と表示したい!
(空白) (空白) (空白) ←これを0と表示したい!

わかりにくい文章ですみませんが、教えてください。

Aベストアンサー

Nz([1列目],0) + Nz([2列目],0)
ですね。
Nz関数については、VBAのヘルプで調べてください。

Qアクセスで数値型のフィールドにNullをいれたい

初歩的な質問ですが、お願いします。
データベースを用いたWebアプリケーションを作成中ですが、数値型のフィールドで、
どうしても空白になってしまう部分があります。
入力フォームが空欄だと、エラーになってしまいます。
明示的にNull値の入力を許可するように設定する、というところ
までは調べてわかったのですが、具体的にはどのように
したらよいのでしょうか?
VBAなどを使わないとダメですか?
よろしくお願いします。

Aベストアンサー

詳しい補足ありがとうございます。
mei0311さんが補足に書かれましたように、フィールドプロパティの規定値をNullにすれば大丈夫そうですね。
ですが、規定値を空欄にしても、入力エラーは出ませんでした(Access上の入力ですが)。

念のため確認させて頂きますが、DBに書き込みに行く際にフォームの入力内容をチェックして、「空欄だと何も書かない」というようにプログラムされていますよね?
数値型のフィールドに、プログラム的にNull文字列を書き込もうとエラーが出たような気がするのですが…(かなり過去の記憶ですのでイマイチ自信がありません)。

QACCESSのクエリー抽出条件にIIFを使用して

コンボボックスの値を抽出条件にしたクエリーを作成しています。
コンボボックスにて"ALL"を選択したときに、全レコードを表示したく、
以下の式を入れたのですが全表示がされません。

IIf([Forms]![テーブル名]![コンボ値]="ALL",Like "*",[Forms]![テーブル名]![コンボ値])

Like "*" の部分がいけないのでしょうか?
(偽の場合は選択した値のレコードが抽出されます)

どなたか教えてください、よろしくお願いいたします。

Aベストアンサー

>IIf([Forms]![テーブル名]![コンボ値]="ALL",Like "*",[Forms]![テーブル名]![コンボ値])
この条件は、抽出したいフィールドの「抽出条件」の所に入力しているんですよね?

ちょっと内容を変えまして・・・
(1)「抽出条件」ではなく、「フィールド」の行に入力してください。
 (つまり、抽出用の新しいフィールドを作成するということです。)
(2)式は
式1: IIf([Forms]![テーブル名]![コンボボックス名]="ALL",True,[テーブル名]![コンボボックス名]=[Forms]![テーブル名]![コンボボックス名])
にしてください。
(3)IIfを入力したフィールドの「抽出条件」に True と入力します。
 (Trueの囲い文字はいりません。)

どうでしょう?ちゃんと出ますよね・・・?
ただし、フィールドを作ったわけですから、
クエリのデータシートビューには必要のない、-1などが表示されたフィールドが表示されますよね。
これは、デザインビューに戻って、表示のチェックボックスをオフにすれば解決します。

IIFというのは、ExcelのIF関数とはちょっとイメージが違います。
以下解説↓

今回の条件式の部分には、[コンボ]="ALL"という評価式(←ポイント!)が入力されています。
Excelでは条件式というイメージが強いですが、
IIFは評価式という意味です。
つまり、この評価式自体がTrueとFalseを持つということです。
IIf([Forms]![テーブル名]![コンボボックス名]="ALL",・・・・)という式で、
条件をALLとしたら・・・
評価結果=True となります。
そして真の場合の処理にTrueを指定することで、IIFの戻り値がTrueになります。
条件にALL以外を入力すると・・・
評価結果=False となります。
そして偽の場合の処理の戻り値が、ALL以外の条件になります。
抽出条件にもTrueを入力したのは、無条件に全件が表示されるのを防ぐためです。

これは、表示をオンにして動作確認すると分かりやすいかも知れませんね。
または、とりあえず現象を直して、理解は後々・・・でもよいかも知れません。
健闘を祈ります!

>IIf([Forms]![テーブル名]![コンボ値]="ALL",Like "*",[Forms]![テーブル名]![コンボ値])
この条件は、抽出したいフィールドの「抽出条件」の所に入力しているんですよね?

ちょっと内容を変えまして・・・
(1)「抽出条件」ではなく、「フィールド」の行に入力してください。
 (つまり、抽出用の新しいフィールドを作成するということです。)
(2)式は
式1: IIf([Forms]![テーブル名]![コンボボックス名]="ALL",True,[テーブル名]![コンボボックス名]=[Forms]![テーブル名]![コンボボックス名])
にして...続きを読む

QAccess 2003 iif [日付フィールド] is null のあとで<>がうまく働かない

Access 2003です。
[Start Date], [End Date]を入力するフォームで日付が入力されていなければ、

iif([Start Date] is null,<[End Date],>[Start Date])

のようにクエリ条件を設定したいのですが、
iif [Start Date] is null
を使うと、続く条件の中で<>がうまく働かないという現象が起きます。
(クエリでなにも抽出されない)

iif([Start Date] is nullの条件を入れなければ(つまり[Start Date],[End Date]はブランクにならないという前提ならば)
1. >[Start Date]
2. <[End Date]
3. Between [Start Date] And [End Date]

などどれも問題なく動きますし、
iif([Start Date] is null~の条件を入れても続く条件の中で<>を使わなければ

iif([Start Date] is null,[End Date],[Start Date])

はちゃんと動きます。
どうしてこのような現象が起こるのか、また回避する方法をご存知のかたがいらっしゃいましたら、どうぞご教示ください。
よろしくお願いします。

Access 2003です。
[Start Date], [End Date]を入力するフォームで日付が入力されていなければ、

iif([Start Date] is null,<[End Date],>[Start Date])

のようにクエリ条件を設定したいのですが、
iif [Start Date] is null
を使うと、続く条件の中で<>がうまく働かないという現象が起きます。
(クエリでなにも抽出されない)

iif([Start Date] is nullの条件を入れなければ(つまり[Start Date],[End Date]はブランクにならないという前提ならば)
1. >[Start Date]
2. <[End Date]
3. Between...続きを読む

Aベストアンサー

回避方法については回答出てますので、どうしてこのような現象が起こるのか、について。

クエリのデザインビューの抽出条件では、式の左辺を省略しますが、実際のSQL文に直した場合、自動的に左辺が追加されます。

例えば、あるフィールド([A]とします)の条件が下記だった場合、

>[Start Date]

実際のSQL文での条件は、左辺が追加され、下記の様になります。

WHERE [A] > [Start Date]


抽出条件が質問の式だった場合、

iif([Start Date] is null,<[End Date],>[Start Date])

実際の条件式は下記の様になります。

WHERE [A]=iif([Start Date] is null,[A]<[End Date],[A]>[Start Date])


[Start Date]がnullだった場合、

WHERE [A]=([A]<[End Date])

と評価され、期待通りの結果とはなりません。


クエリのデザインビューは便利ですが、万能ではありません。
(全てのSQL文を表現できる訳ではない)

クエリの実体はSQL文です。複雑なクエリの場合、SQL文についての知識が必要になってきます。

興味があれば、SQL文について勉強してみて下さい。

回避方法については回答出てますので、どうしてこのような現象が起こるのか、について。

クエリのデザインビューの抽出条件では、式の左辺を省略しますが、実際のSQL文に直した場合、自動的に左辺が追加されます。

例えば、あるフィールド([A]とします)の条件が下記だった場合、

>[Start Date]

実際のSQL文での条件は、左辺が追加され、下記の様になります。

WHERE [A] > [Start Date]


抽出条件が質問の式だった場合、

iif([Start Date] is null,<[End Date],>[Start Date])

実際の...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング