【初月無料キャンペーン中】gooドクター

式1: DCount("コード","テーブル","コード=" & [テーブル]![コード])

結果の2以上のものを抽出したいのですが、どのように記述するのでしょうか?

>1または>=2またはnot 1でもいいですが・・・
記述方法が良く分かりません。

gooドクター

A 回答 (6件)

No.3です。



> コード=の構文エラー 演算子がありません。
> 不明。
> とエラーメッセージが表示されます。

そのエラーメッセージの内容からすると、『コード』が「Null」(空白)のものがある、
ということだと思います(その事態は想定していませんでした)。
一応、こちらで作成したサンプルにて、DCountを使用した場合に、同様の
メッセージ(計2件)が表示されるのは確認しました。
(補足の文意を「集計クエリで解決はできたが、DCountの方はエラーとなる」
 と取りました。もしも集計クエリの方でも上記エラーが出ているようでしたら、
 元となるテーブルとクエリの情報(フィールド名とデータ型)をお知らせ下さい)
※なお、コードは数値型と想定しています。もしも文字列方の場合は、併せて
 式を「"コード='" & [テーブル]![コード] & "'"」と変更する必要があります。

上記のエラーを回避するには、DCountの第1引数を「*」にします。
また、コードがNullのレコードで、クエリの表示結果が「#エラー」となるのを
回避するためには、第3引数にNz関数を使用します。
(コードの最小値は0か1でしょうから、「最小値-1」(=-1か0)にするのがよいかと
 思います)

【Nullは重複数に含めない場合】
DCount("*","テーブル","コード=" & Nz([テーブル]![コード],-1))
※コードがNullの場合は、第3引数の結果がTrueにならない(Null=-1)ので
 0件扱いとなるため、抽出条件の「>1」で弾かれます。
 また、第3引数にNz関数を使用する代わりに、クエリの『コード』の抽出条件に
 「Is Not Null」を指定する(→最初から集計の対象外にする)方法もあります。

【Nullも1つのコードとして重複扱いする場合】
DCount("*","テーブル","Nz(コード,-1)=" & Nz([テーブル]![コード],-1))

この回答への補足

>上記のエラーを回避するには、DCountの第1引数を「*」にします。
コードは数値で第1引数は"コード"で問題ないようなので
コードが文字だった場合、「*」ということでしょうか?

「"コード='" & [テーブル]![コード] & "'"」

文字列の場合は’で囲うと聞いたことがありますが、
これは、どこに対してかけている事になるのでしょうか?
例えばテーブル!コードだとすると

"コード=" & '[テーブル]![コード]'
では駄目だということですよね?

区切りの位置が今ひとつ分からないのですが・・・。

補足日時:2009/08/14 13:49
    • good
    • 0

No.3/4/5です。



> それとこれはDCount("*","テーブル","品名='筆記具'")
> DCount("品名","テーブル","品名='筆記具'")
> でも問題ないですよね。

この例なら、それで大丈夫です。
(第3引数を省略した場合は、品名がNullのものがカウントの
 対象になるかどうかが変わりますが、上記の例では第3引数
 の条件によって、どちらもNullが除外されるので)


> そもそも[]ではなく""でフィールドとテーブルを指定するのは
> D関数の仕様なのですかね。

上の「DCount("品名","テーブル","品名='筆記具'")」の式は、
実は
 「DCount("[品名]","テーブル","[品名]='筆記具'")」とか
 「DCount("[品名]","[テーブル]","[品名]='筆記具'")」と
書くこともできるんです。
(特に、フィールドについては、「品名 A」といったように、間に
 半角スペースが入った名前の場合は、角括弧が必須)

集計関数(DCountなど)の引数を、「""」で括るかどうかは、
引数に指定したフィールドや式などをいつ評価するか、という
タイミングの指定になっています。

例えば、テーブル1が以下のようだったとします(全4レコード):
【コード】 【品名】 【フラグ】
   0  いちご   True
   1   りんご   False
   2   なし    False
   3   みかん   True
(「フラグ」のデータ型はYes/No型とします)

このとき、
  式1: DCount("*","テーブル1",[フラグ])
だと、クエリの各レコードで「フラグ」フィールドが評価されます。
そのため、「フラグ」がTrueのレコードでは「4」が、またFalseの
レコードでは「0」が、それぞれ表示されます。
(DCount関数は、第3引数の評価結果が「False(=0)」の
 レコードは無視し、それ以外のレコードをカウントします)

一方、
  式1: DCount("*","テーブル","[フラグ]")
にすると、「""」で括られているために、クエリでは文字列として
扱われるため、クエリ内での「フラグ」フィールドの値には依存
しなくなります。
その結果、(第2引数で指定した)「テーブル1」での「フラグ」が
評価され、「フラグ」がTrueになっているレコードの数(=2)を、
全てのレコードで返すことになります。
(なお、第3引数の「"[フラグ]"」は、Access上では
 「"[フラグ]=True"」を指定したものとみなされるため、
 上記のような結果になります)


> 演算子は""に入れないと駄目?

これも、式の結果が不正(=False)な場合、例えば
 DCount("*","テーブル1",1=2)
のような条件を指定すると「0」しか返しませんし、
 DCount("*","テーブル1",1=1)
のように式が成立(=True)する場合は全件数を返しますので、
式の内容次第、ということになるかと思います。
(ご提示の式では演算子がらみのエラーになるかと思いますが)
    • good
    • 0
この回答へのお礼

>「フラグ」がTrueのレコードでは「4」
[フラグ]フィールドのレコードが評価され
表示されるということですね。

>文字列として扱われるため
うーん・・・
文字列として扱われるとフィールド全体の評価になるのですかね

分かったような、分からないような。

ともかく回答ありがとうございました。

お礼日時:2009/08/18 16:03

No.3,4です。



> コードは数値で第1引数は"コード"で問題ないようなので
> コードが文字だった場合、「*」ということでしょうか?

・・・すみません、また確認間違いをしていました(汗)

正しくは、第1引数に関係なく、コードがNullだった場合に、第3引数
での不正評価によってDCount関数の戻り値が「#エラー」となり、
抽出条件での「>1」の指定により『「#エラー>1」の正否』の不正評価
が発生することが原因でした。
大変失礼しました。


> 区切りの位置が今ひとつ分からないのですが・・・。

この件は、確かにややこしく、わかりやすい説明というのもしにくい
のですが・・・(汗)

データ型が「テキスト型」のフィールドを持つテーブルを元にクエリを
作成して、抽出条件を指定したことがあるかと思いますが、
その場合、指定したのが数値か文字列かに関わらず、抽出条件は
自動で「"」で括られます。
(数値型のフィールドの場合は、数値を指定すると括りは入らない)

DCount関数などの集計関数でも同様に、文字列の場合は条件を
「"」で括る必要があります。
ただ、第3引数は、通常は引数全体を文字列として指定するために
既に「"」で括られています。
そのため、「"」の代わりに「'」を使用します。
(なお、クエリの抽出条件でも、自動で追加される「"」の代わりに、
 予め「'」で括りを指定してやることもできます:
 検索したい文字列自体に「"」が含まれる場合に使ったりします)

例えば、『品名』フィールドが「筆記具」のものをカウントする場合は
 DCount("*","テーブル","品名='筆記具'")
といった感じです。
(第3引数に「品名='筆記具'」という文字列式を指定している)

一方、今回のご質問のように、第3引数の右辺を、レコードの値で
変化させたいという場合は、「筆記具」の部分に、レコードごとの
フィールドの値が入るように、「品名='(フィールドの値)'」という形に
してやらなければなりません。
つまり、左側の「品名='」と右側の「'」は一定(文字列)で、真ん中
だけフィールドに従属、ということです。

そのため、
 一定の文字列の部分は「"」で括り、
 フィールドの値を使用するところは「[テーブル]![○○]」
といった形で指定してやることになります。


> "コード=" & '[テーブル]![コード]'
> では駄目だということですよね?

そうですね、この状態ですと、「[テーブル]![コード]」は「'」で括られて
しまっていますので、フィールドの値ではなく「[テーブル]![コード]」と
いう文字列が検索条件になってしまいます。

区切り位置を、感覚的にもう少しわかりやすくする、という意味では、
フィールドの値を括るのに使用する「'」を完全に別扱いにして、
  「"コード=" & "'" & [テーブル]![コード] & "'"」
としてしまうのもいいかもしれません。


・・・参考になるとよいのですが・・・(汗)

この回答への補足

分かるような分からないような・・・

そもそも[]ではなく""でフィールドとテーブルを指定するのは
D関数の仕様なのですかね。

"コード="ではなく"コード"=とすると=が文字扱いになってしまう
と言う事なのですかね?
例えば
"コード" = & '"[テーブル]![コード]"'
では駄目なんですかね。
演算子は""に入れないと駄目?

それとこれはDCount("*","テーブル","品名='筆記具'")
DCount("品名","テーブル","品名='筆記具'")
でも問題ないですよね。

補足日時:2009/08/17 16:02
    • good
    • 0

前回のご質問では、確認不充分で失礼致しました(汗)


http://oshiete1.goo.ne.jp/qa5196729.html

> 記述方法が良く分かりません。

No.1の方の回答の通り、『抽出条件』欄(クエリのデザインビューの下半分の
領域、『表示』のチェックボックスの下)に、直接「>1」を記入すればOkです。
(または「>=2」でもOk。1万件程度のレコードが入ったテーブルで簡単なテスト
 をした限りでは、どちらでも速度に違いは見られませんでした:
 有意差が見られるよう、10秒程度掛かるように反復処理させて確認)

但し、式の記述は「"コード=" & [テーブル]![コード]」で問題ありません。

※重複があるものの確認ということでしたら、『集計クエリ』を使用した方が
 速度的には有利かと思いますので、よろしければ検討してみてください。


参考:
http://oshiete1.goo.ne.jp/qa5193921.html
「ACCESS DCOUNTの抽出条件につ」の回答画像3

この回答への補足

残念ながらそれでは、
コード=の構文エラー 演算子がありません。
不明。
とエラーメッセージが表示されます。

言われるように集計クエリ(カウント)ファイルを一つ作り
そのクエリを使い、結合プロパティで同じ行を求めるようにしました。

補足日時:2009/08/13 14:12
    • good
    • 0

Sub test12()


MsgBox DCount("[個数]", "所持品", "[個数]>1")
End Sub
(確認済み)
例データ
所持品テーブル
ID氏名住所個数
1山田Å市3
2山田Å市0
3山田Å市1
4鈴木B市2
5鈴木B市3
6田中C村3
7田中C村1
8田中C村2
のような、"[個数]>1"の書き方になると思います。
結果 5
==
]![コード])がパラメータクエリを意図するなら、この関数中で[ ]では出来ないようです。
氏名をその都度指定したいならVBAで
Sub test11()
n = InputBox("名指定")
MsgBox DCount("[氏名]", "所持品", "[氏名]=" & Chr(39) & n & Chr(39))
End Sub
のようにすれば出来るようです。

この回答への補足

よく意味が分かりません。
具体的なフィールドをあげると

コード_ID
1_1
1_2
2_3
3_4
3_5

ここでコード1に関しては2つ
コード2に関しては1つなので抽出対象外←これが出来ない。
コード3に関しても2つ

サブクエリを使わなければ無理なのですかね・・・
よく分かりませんが。

補足日時:2009/08/13 14:04
    • good
    • 0

式1の結果が2以上のものを抽出したいということでしょうか?


その場合、式1となっているのでクエリだと思うのですが、そうであれば、式1の抽出条件欄に >=2 と入力すればよいです。

ただし、式1の記述方法に問題があるようです。

記述は、
DCount("[フィールド名]","テーブル名","抽出条件") となり、
抽出条件は例えば[個数]フィールドが10以上のレコード数をカウントする場合は、 "[個数]>=10" と記述します。

抽出条件として、
"コード=" & [テーブル]![コード] は誤りになるかと思います。
その辺は割愛します。

この回答への補足

その当たりが良く分かりません。

補足日時:2009/08/13 14:00
    • good
    • 0

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

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

gooドクター

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

人気Q&Aランキング