Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


403 / 9994 ←次へ | 前へ→

【12904】Re:グループ化の連番
回答  かるびの  - 15/11/10(火) 16:58 -

引用なし
パスワード
    アクセスは、連番を振るというのは得意ではありません。

 でも、方法がないわけではありません。
 しばしば言及されるのは、DCount 関数を使う方法です。

 今回の場合は、グループ化を行うという点がワンランク難しくしています。


 後から考えていきます。
 御希望の選択クエリを作るためには、

日付    連番
2015/06/06   1
2015/06/07   2
2015/06/08   3

というレコードを持つクエリ(Q連番)を作ることが必要です。
 このクエリとT_部品とを日付フィールドで結合させれば、
御希望の選択クエリになります。

 
 Q連番を作るためには、

日付   
2015/06/06
2015/06/07
2015/06/08

というクエリ(Q日付まとめ)が必要です。
 このクエリは、T_部品から簡単に作れます。
 その方法ですが、日付をグループ化したクエリとするか、
又は、クエリのデザインビューでマウスを右クリックして、
クエリのプロパティシートを出し、
そこにおいて、「UniqueValues/固有の値」プロパティに 「Yes/はい」 を設定します。


 次に、Q連番に戻ります。
 Q連番において、連番フィールドをどのように求めるかです。
 
 「Q連番」クエリにおいて、例えば、日付フィールドの値が2015/06/08であるレコードについて考えてみます。
 このレコードについては、連番フィールドの値を3としたいわけですが、
「Q日付まとめ」において、日付が「2015/06/08」以下であるレコードの個数を
得られれば、3という結果を得られます。


 一定の条件に合致するレコードの個数を求めるには、DCount関数を使います。

 DCount関数の詳しい説明は、ヘルプを見てもらうとして、ヘルプではわかりにくいところを指摘しておきます。
 DCount関数では、第3引数の書き方が難しいんです。


 第3引数の書き方ですが、基本形は「フィールド名 = 値」という形の文字列を指定します。

 ただし、値の書き方にはクセがあります。

 フィールド名のデータ型が数値型の場合は値は何も囲みません
(例「数量 = 200」)。

 日付型の場合は#で値を囲みます(例「生年月日 = #2000/05/01#」)。
 なお、日付は、本来は、米国での記載の仕方に従い、「月/日/年」の順で記載すべきもののようです。
しかし、Windowsの日付設定を年/月/日の順にしておけば、年/月/日でも大丈夫のようです。

 テキスト型の場合はダブルコーテーションで値を囲みます
(例「市町村 = "札幌市"」)。
 なお、第3引数は文字列を指定するので、
文字列であることを示すため、第3引数全体をダブルコーテーションで囲みます。
 そうすると、第3引数全体を囲うダブルコーテーションと、
値を囲うダブルコーテーションとを区別できなくなってしまいます。
 そのため、値を囲うダブルコーテーションはシングルコーテーションにします。
 結局、テキスト型の場合は、例えば、「市町村 = '札幌市'」のようにします。
 なお、この場合、内側のダブルコーテーションは、二重使いとする、
例えば「"市町村 = ""札幌市"""」のようにするのが正式みたいです。
 でも、シングルコーテーションを使った方が見易いので、
ダブルコーテーションの二重使いはあまり使われないようです。


 次の問題ですが、上記の「フィールド名 = 値」における「値」は、
Q連番においてレコードごとに異なるため、これをどう表現するかです。
 私は、ヘルプを熟読しても、ここのところがさっぱりわかりませんでした。

 Q連番において、第3引数は、
1番目のレコードでは「"日付 = #2015/06/06#"」と
2番目のレコードでは「"日付 = #2015/06/07#"」と
3番目のレコードでは「"日付 = #2015/06/08#"」と
したいわけです。

 この、例えば「2015/06/06」の部分は、
Q連番の日付フィールドの値であるわけなので、
「2015/06/06」の部分は「日付」と置き換えます。
 単純に置き換えると、「"日付 = #日付#"」となるわけですが、
しかし、#はあくまで日付を囲うものであり、
これだと#は日付ではなく「日付」という文字列を囲っていることになってしまうので、この書き方だとエラーになってしまいます。

 そこで、「"日付 = #" & 日付 & "#"」とします。
 「日付」が2つ出てきますが、
左辺の「日付」は、T_部品テーブルの日付フィールドという意味であり、
右辺の、&で囲まれた「日付」は、Q連番の日付フィールドという意味です。
 ここでは、&で囲まれた方の「日付」が
ダブルコーテーションで囲われた中に入っていない
というところが重要なところです。

 つまり、Q連番において、1番目のレコードでは、日付は2015/06/06でしたが、
&で囲われた日付は、ダブルコーテーションの外にいるため、
Q連番の日付フィールドの値と同値、
すなわち、2015/06/06と同じということになります。
 これに「日付 = #」とか「#」とかの文字列を連結させると、
結果、「日付 = #2015/06/06#」という文字列が完成します。
 「2015/06/06」の部分はQ連番においてレコードごとに異なる値となりますので、
1番目のレコードでは「"日付 = #2015/06/06#"」と
2番目のレコードでは「"日付 = #2015/06/07#"」と
3番目のレコードでは「"日付 = #2015/06/08#"」と
することができます。


 以上のとおり、御希望の選択クエリとするためには、
選択クエリを3つ作ることが必要になります。
 これを1つのクエリで一挙にやってしまおうということは、
多くの場合、できません。
 クエリは、一つ一つ順を追って組み立てていくことが必要です。
 標語風に言えば、「1クエリ1処理」といったところです。


 DCount関数を使う方法は以上ですが、DCount関数などのいわゆるD系関数を
クエリで使うと、クエリが重くなる、ないし遅くなります。
 パソコンの性能にもよりますが、
以前は、「DCount関数をクエリで使うと、遅過ぎて実用に堪えない」
と言われていました。

 ここを速くするためには、上記でいうQ連番をクエリではなく、
テーブルにしてしまうという方法があります。
 この方法は、クエリを開く都度、テーブルを書き替えて、
当該テーブルにQ連番のようなレコードを格納します。
 しかし、この方法は、第1に、VBA必須となります。
 第2に、クエリを開くという操作では
VBAのコードを実行させるきっかけにはできず、
フォームやレポートからでないと使えません。
 そのため、クエリで実現したいという希望には合いませんね。
 でも、D系関数を使うより断然速いです。

 
 なお、参考ページを示しておきます。 

 Recordset_連続番号の振り方:SampleFile071
 ht tp://www.accessclub.jp/samplefile/samplefile_71.htm

1,013 hits

【12903】グループ化の連番 yoko 15/11/9(月) 23:47 質問[未読]
【12904】Re:グループ化の連番 かるびの 15/11/10(火) 16:58 回答[未読]
【12905】Re:グループ化の連番 yoko 15/11/11(水) 20:43 お礼[未読]

403 / 9994 ←次へ | 前へ→
ページ:  ┃  記事番号:
1078188
(SS)C-BOARD v3.8 is Free