プロが教える店舗&オフィスのセキュリティ対策術

データシート(サブフォーム)の複数条件抽出について。

現在メインフォーム上に、オートフォーム:データシート(基となるテーブル(マスターA)選択)
をサブフォームとして置き、メインフォーム上にコンボボックス2個(コンボ1、コンボ2)&コマンドボタン1個設置してあります。

基テーブル(マスターA)には
種類    サイズ    商品名
の3フィールドがあります。

やりたい事は、コンボ1(対応フィールド:種類)及びコンボ2(対応フィールド:サイズ)で選択し
コマンドボタンを押下で、サブフォーム内データの抽出です。

まだACCESSを始めたばかりの未熟者のため、ネットや本で調べながらやっているのですが
どうしても上記がわからなくて完全に進行ストップしてしまったので
ご教授願いたいと思い質問させて頂きました。

Filterをかけ、条件はANDで繋げば良いとは思うのですが
どのようにコードを組み上げれば良いのか調べつかないため
何卒ご教授の程宜しくお願い致します。

また、質問させて頂いている間も引き続き自分で調べながら
やっていこうと思います。

A 回答 (2件)

>私の環境は、ACCESS2000、DAO利用、そして今回はクエリを使用してもしなくても・・・


>というよりも、どのように組み上げたらいいのかわからなかったので・・・すみません。

方法は問わない、というより、ちょうど#1で示した例が殆ど使えますね^^
Accessは組み立て方やDB接続方法なども多種多様に存在しますので、その分覚える事が多いのは確かですね。
ただその方法一つでレスポンスに大きく関わってくる場合があるので、ある程度一人で組み立てられるようになると、次の課題は「レスポンス」になってくると思います。

>If rs.RecordCount <> 0 Then
>   'レコードがあった際の処理
>こちらには、サブフォームへ表示させるコードを入れれば良いのですよね?

その通りです。


>その際、サブフォームへ表示させるのはどのようにしたらいいのですか?

現状、どこまで組みあがってますか?
初期表示でサブフォームに表示、などの処理はまだ未実装でしょうか?

一応一から説明しておきますと、
・データシートと連結させる用のワークテーブルを作成
 ・フィールドは「種類」・「サイズ」・「商品名」
・サブフォーム(データシート)とワークテーブルを連結させる
 ・デザインビューでメインフォームを開き、サブフォームを右クリック→プロパティ
 ・ソースオブジェクトに先ほど作ったワークテーブルを指定

ここまでが環境条件になります。

次にソース側ですが、
Set rs = qd.OpenRecordset
でクエリで抽出したデータをrsにセットしたので、その抽出したデータを今度はワークシートに登録(Insert)してやる必要があります。

ですので、

Private Sub コマンドボタン_Click()
Dim dbLocal As Database
Dim rs As DAO.Recordset
Dim rs2 As DAO.Recordset
Dim qd As DAO.QueryDef

Set dbLocal = CurrentDb
Set qd = dbLocal.QueryDefs("クエリ_マスターA")
qd![検索種類] = Me.コンボ1
qd![検索サイズ] = Me.コンボ2
Set rs = qd.OpenRecordset

If rs.RecordCount <> 0 Then
rs.MoveLast '一度抽出したデータの最終行に移動
rs.MoveFirst '最初の行に移動
    DoCmd.RunSQL "delete * from ワークテーブル"  'ワークテーブルのデータを一度削除
Set rs2 = dbLocal.OpenRecordset("ワークテーブル") 'ワークテーブルを開く
With rs2
Do While Not rs.EOF '抽出したデータの最終行までループ
.AddNew 'ワークテーブルへの書き込み
rs2!種類 = rs!種類 '抽出した「種類」をワークテーブルのフィールド「種類」へ
rs2!サイズ = rs!サイズ '抽出した「サイズ」をワークテーブルのフィールド「サイズ」へ
rs2!商品名 = rs!商品名 '抽出した「商品名」をワークテーブルのフィールド「商品名」へ
.Update 'コミットのようなもの
rs.MoveNext '抽出したデータの次の行へ
Loop
End With
Else
'レコードがなかった場合の処理
End If

End Sub

こんな感じでワークテーブルに登録してやります。

サブフォームのソースオブジェクトにテーブル名をいれることで、そのサブフォームは書かれたテーブルと連結状態になります。
簡単にいうと
連結状態になる=テーブルのデータがその件数分だけ表示される
ということですので、その連結させたテーブルにデータを入れてやれば、画面にも表示される、という仕組みです。
なんかふとクエリで抽出しないと動的に変わらなかった気もしますが・・・一応上記で試してみてください。
    • good
    • 0
この回答へのお礼

sykt1217さん誠にありがとうございます。
とても丁寧且つ細かい説明頂き、理解しやすかったです。

今回のご提示頂いた方法は、今後私にとってはとても利用頻度が高くなると
思います。抽出したものを表示というものが多いので・・・。

まだ完全に理解しているわけではありませんが、
これからも勉強していきたいと思います。
まずは、自分で組めるようになるまで。
その先のレスポンスは、先の事過ぎるので、とりあえず考えないようにします。

誠にありがとうございました。
1歩進む事ができました。

お礼日時:2010/04/23 18:55

ちょっと環境がわからないので、一部の例を記します。


質問する際はAccessのいくつか、DAOを用いているのか、ADOを用いているのか、Accessクエリは使用するか否かなどを書いてもらえると回答しやすくなります。

一部例:DAO・Accessクエリを使用した場合

(1)Accessクエリ「クエリ_マスターA」を作成(名前はテキトーです)
(1)-1 「クエリ_マスターA」のフィールドに「種類」「サイズ」「商品名」をセット
(1)*2 フィールド「種類」の抽出条件に「[検索種類]」をセット(抽出条件名はテキトーです)
(1)-3 フィールド「サイズ」の抽出条件に「[検索サイズ]」をセット(抽出条件名はテキトーです)

(2)コマンドボタンの「クリック時」のイベントを作る(Private Sub コマンドボタン_Click())
(2)-1 イベント内で以下を記入
Private Sub コマンドボタン_Click()
 Dim dbLocal As Database
 Dim rs As DAO.Recordset
 Dim qd As DAO.QueryDef

 Set dbLocal = CurrentDb
 Set qd = dbLocal.QueryDefs("クエリ_マスターA")
 qd![検索種類] = Me.コンボ1
 qd![検索サイズ] = Me.コンボ2
 Set rs = qd.OpenRecordset
 If rs.RecordCount <> 0 Then
   'レコードがあった際の処理
 Else
   'レコードがなかった場合の処理
 End If
End Sub

たぶんこれで出来ると思います。
DAOを用いる場合は、エディタの「ツール→参照設定」に「Microsoft DAO x.x Object Library」があることを確認して下さいね。(ない場合はリストから探してチェックを入れて下さい。)
  

この回答への補足

sykt1217さんありがとうございます。
そして大変失礼致しました。

私の環境は、ACCESS2000、DAO利用、そして今回はクエリを使用してもしなくても・・・
というよりも、どのように組み上げたらいいのかわからなかったので・・・すみません。

1点確認があるのですが
If rs.RecordCount <> 0 Then
   'レコードがあった際の処理
こちらには、サブフォームへ表示させるコードを入れれば良いのですよね?
その際、サブフォームへ表示させるのはどのようにしたらいいのですか?


大変お手数をお掛けしますが、引き続きお付き合い頂けれ有難いです。
あまりに未熟で申し訳ございません。

補足日時:2010/04/23 13:23
    • good
    • 0

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