- ベストアンサー
Accessのフィルターの実行について【長文です】
Access初心者です。 教えてください。 テーブル部 = 部ID、部名 テーブル課 = 課ID、部ID、課名 テーブル班 = 班ID、課ID、班名 テーブル"メンバー" = メンバーID、班ID、メンバー名 もちろん、"部ID"、"課ID"、"班ID"、"メンバーID"は全く重複していません。 上記の4つのテーブルがあり、 テーブル総合には、"部"、"課"、"班"、"メンバー"を表形式の入力フォームでプルダウンで選択入力したいと思います。 まず、"部"を選択して、 次に"課"を入力するときに、先に入力した"部"に所属する"課"のみをプルダウンで表示させ、 次に"班""メンバー"も同様に、フィルターを掛けてプルダウンで入力表示させてさせたいのですが、うまくフィルターが掛かりません。 現在トライしている方法は、"部"を入力した後の"課"の入力ですが、 フォームデザイン⇒コンボボックス:部のプロパティ⇒更新後処理でフィルター実行マクロ実施でフィルターを掛けています。 フィルターマクロは、 [Forms]![入力フォーム]![部]=[テーブル課]![部-ID] で、マクロ名は、"課選択"です。 これで、プルダウンで"部"を選択すると、<<オブジェクト'課選択'が見つかりませんでした。オブジェクトが存在していること、名前やパス名が正しいことを確認してください>>と、エラーメッセージが出ます。 なお、リレーションは取っています。(あまり関係ないと思いますが・・) この方法で間違っているのは何処なのでしょうか?? また、別の方法でプルダウンでフィルターを掛けながら部⇒課⇒班⇒メンバーを入力する方法は有りますか?? ちなみに、使用者は、Access2000、Access2003両方のユーザーが存在しますので、両方での操作が可能で有る事が必要です。私は、会社では2000、自宅では2003で編集しています。 ご教授、よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
参考URL見ればすぐわかると思いますが、一応サンプルを。 テーブル名、テーブル構成は一緒です。 コンボは 部→コンボ0 課→コンボ1 班→コンボ2 課のクエリの設定 部IDのところの抽出条件に [Forms]![フォーム1]![コンボ0].[Value] 参考SQL SELECT テーブル課.課ID, テーブル課.課名, テーブル課.部ID FROM テーブル課 WHERE (((テーブル課.部ID)=[Forms]![フォーム1]![コンボ0].[Value])); 班クエリの設定 課IDの抽出条件のところに [forms]![フォーム1]![コンボ1].[value] 参考SQL SELECT テーブル班.班ID, テーブル班.班名, テーブル班.課ID FROM テーブル班 WHERE (((テーブル班.課ID)=[forms]![フォーム1]![コンボ1].[value])); ---------------------------------------------- Private Sub コンボ0_AfterUpdate() Me.コンボ1.Value = Empty '前に選んだデータをクリアする Me.コンボ2.Value = Empty Me.コンボ1.Requery Me.コンボ2.Requery End Sub Private Sub コンボ1_BeforeUpdate(Cancel As Integer) Me.コンボ2.Value = Empty Me.コンボ2.Requery End Sub ----------------------------------------------------- 私の環境では動作確認済みです。 [環境] XPsp2 Access2002
その他の回答 (4)
s_husky です。 ・AfterUpdate() で、RowSource を更新は間違い! ・予め、プロパティで設定しておく。 ・AfterUpdate() では、Requery で事足りる。 とんだ勘違いでした。
- CHRONOS_0
- ベストアンサー率54% (457/838)
ちょっとテーブルがおかしいようですね テーブルメンバーは [メンバー](メンバーID、メンバー名、生年月日、性別、・・・) テーブル総合も名前が変ですね、所属を入力したいのであれば [所属](メンバーID、部ID、課ID、班ID) >プルダウンで選択入力したいと思います。 というのはコンボボックスのことでしょうか、とすると >更新後処理でフィルター実行マクロ実施でフィルターを掛けています。 このフィルたって何に対してかけているのでしょう?フォーム? 普通このような場合コンボの値集合ソースをクエリにしておいて 上段のコンボの更新後イベントで、下段のコンボを再クエリしてやります
スーツのデザイナでプログラマではありません。 軽ーく、参考程度に読み流して下さい。 <テーブル設計に関して> <班> ID・・・・・・long 部_ID・・・long 課_ID・・・long 1 名称・・・・Char(32) <部><課> ID・・・・・・long 名称・・・・Char(32) この場合、部と課の名称は重複しないように登録するだけです。 いわば、この2つは単なる部課名リストデータです。 どの部にどういう課がるかは、班データの登録フォームで定義します。 さて、以下は、テーブル<班>のクエリです。 ID 部_名称 課_名称 班_名称 1 総務 庶務1 第1班 2 総務 庶務2 第1班 3 経理 庶務1 第1班 4 経理 庶務2 第1班 つまり、<班>をコンボ表示すれば、部課も含めて一括表示、一括選択できます。 もちろん、次のように絞り込み選択も可能です。 <いかにして、部、課、班と絞り込むか?> Private Sub 部名一覧_AfterUpdate() Dim strWhere As String strWhere = "部_名称='" & 部名一覧 & "'","課_名称" 課.RowSoutce = DBSelect("課_名称", "班", strWhere, True, True) Sub Private Sub 課名一覧_AfterUpdate() Dim strWhere As String strWhere = "部_名称='" & 部名一覧 & "'","課_名称 AND 課_名称='" & 課名一覧 & "'" 班.RowSoutce = DBSelect("班_名称", "班", strWhere, True, True) Sub 部名一覧、課名一覧が更新される都度に班を絞り込んでいます。 課.Requary 班.Requary は、必要であれば書き加えます。 *もちろん、コンボボックスのリストデータを生成する DBSelect関数は用意されていません。 *大した関数ではありませんが、全体のアイデアが違うようなので示すことはしません。 *まあ、こういう考えもあると流し読みして頂ければ幸いです。
- o_chi_chi
- ベストアンサー率45% (131/287)
部の更新後処理で課の値集合ソースのクエリを変更してやれば 希望のことができると思います。 モジュールの最後にフォーカスを自分(この場合部)に設定 してください。 フォーカス喪失後の場合にはフォーカスの再設定は不必要です。 あとマクロを多用すると後々のメンテナンスが難しくなります。 モジュールを使用することをお勧めします。 --- Private Sub 部_AfterUpdate() Me.課.Value = "" Me.課.RowSource = "Select * From 課 Where 部ID = 'ID';" DoCmd.GoToControl "部" End Sub