• ベストアンサー

ACCESSのフォーム

アクセスのDBに テーブル(T1:レコードが100件) フォーム(F1) フォーム(F2) があります。 F1、F2はT1のデータがリンクされています。 F1を開き(全部で100件)、 フィルタをかけ(20件になる) そのままF1を開いた状態でF2を開くと、 F1でフィルタをかけた状態(20件)で表示させるには どうすればよいでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
noname#223623
noname#223623
回答No.5

CARDですか。懐かしいですね。まだ具体的には何も考えてないのですが考え方だけ書きます。 > どのフィールドにフィルタをかけるかという基準がないのです。 とのことですが、基準がないと無理でしょう。「CARDではできたのに」と思われるかもしれませんが、ユーザが意識しないだけでCARDは何らかの基準を決めてたはず。で、今回の基準は「最後に実行したフィルタ条件」になるんじゃないですか? だとすれば、基本的な考えとしては次のようになると思います。 [1] フィルタの条件を保存するものを用意する。例としてはメインフォームにテキストボックスを追加する [2]フォームを開くときに、[1]で保存した条件を参照して自分にフィルタをかける [3]フィルタを変更したときは、[1]を更新する フィルタ条件の保存先は、テキストボックスでなくてもよし。VBAでやるなら変数でもOK。ようするに開いたフォームから参照できればどこでもOK。 あとは、どのタイミング(イベント)で条件を保存するのか、逆に、保存された条件をいつ適用するのかが決まればできるんではないでしょうか。

itodai777
質問者

お礼

>>「最後に実行したフィルタ条件」になるんじゃないですか? まさにその通りです。 やり方は上記のようにし、あとはタイミングをいろんな事をしながら図っていきたいと思います。 ありがとうございました。

その他の回答 (5)

noname#79209
noname#79209
回答No.6

フィルタの基準によってフォームを分けているのが良くないのでは? 絞り込んだ結果を表示する内容が同じなら、ひとつのフォーム内で絞り込みアイテムを指定するテキストボックスをいくつかと絞り込み実行ボタンを作れば良いのでは? 絞り込み実行ボタンには、テキストボックスに入力された条件によってフィルタを作り出すプロシージャを組み込んでおきます。

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.4

メインフォーム(F3)に、フィルタ式を記録しておく非表示テキストボックスを設置しておき、各フォームでフィルタを実行したら、そのフィルタ式を保存する、というのはどうでしょうか。 で、展開中のフォームがあればそのフィルタを適用し、新しく展開するフォームのときは展開時に適用、と。 また、フィルタ解除時には上記テキストボックスをNullに戻すようにすれば、「上記テキストボックスがNullかどうか」をフィルタ適用の場合分けの条件に使用できます。

noname#223623
noname#223623
回答No.3

わかりにくいところがあるので補足してください。 1. F1でデータを絞り込んでいるのに、なぜわざわざF2でまた同じデータを表示するのか。表示内容が違うのかな?やることによってはF1だけで処理できるように思います。 2. フィルタで表示件数を絞り込んでいるようですが、Excelと違ってAccessではクエリーを使ったほうが素直な気がします。クエリーを使わない理由はなんでしょう。 3. #1の補足では >フォームは全部で10個あり、どのフォームを最初に開くか解らないのです ということですね。ではF1以外のフォームを開いてF2を開いたらどうなるんでしょう?いきなりF2を開いたときは?つまり、何を基準にしてF2の件数を絞るのかということ。 とりあえず、このへんを明確にすれば的確な回答に近づくと思いますよ。

itodai777
質問者

補足

ご指摘ありがとうございます。 OS:Win2k ACCESS 2000 F1:発注フォーム  F2:納品フォーム F3~F10:その他(よくわからないまとまりのフォーム) F1の内容の商品を発注し、届いたものをF2に入力 その他の雑処理は、F3~F10にその都度入力 T1のキーは伝票番号(a)で、オートナンバーです。 1:T1にはフィールドがa~zまであり F1にはa~g F2にはa,h~m を表示させています。 F1,F2共(F3~F10も)にどのフィールドをフィルタをかけるかその都度変わります。 例1:F1の発注日付(c)でフィルタ→F2で確認 例2:F2の納品日付(h)でフィルタ→F3の担当者等を確認 例3:F3の会社(p)でフィルタ→F1の伝票番号等を確認 例4:F1の発注先(e)でフィルタ→F2、F3で確認 なので、どのフォームを最初に開けるか、又、どのフィールドにフィルタをかけるかという基準がないのです。 表示件数を確認というより、前のフォームで絞られたのを新たに開いたフォームで確認するのが目的です。 最初にフォーム(メインではない)を開いたら、全件(100件)表示されていて、そのフォームをフィルタをかけずに最小化し、次に新たなフォームを開くと全件(100件)。で、2番目に開くフォームでフィルタをかけて(例えば20件)最小化し、今度は3つ目に新たなフォームを開くと20件に。で、1つ目に開いたフォームも20件になってなければいけない。というものです。 実はこれは、The CARD というシステムをACCESSに移行する際、CARDの機能で「検索結果を連結」というのがあり、 その機能をACCESSに実装する上で必要なのです。

  • Gin_F
  • ベストアンサー率63% (286/453)
回答No.2

バージョンが不明ですが、F3 フォームの btnF2 ボタンのクリック時イベントで F1 フォームが開いているかを確認すればよさそうですね。 If CurrentProject.AllForms("F_利用者").IsLoaded Then   DoCmd.OpenForm FormName:="F2" _           , WhereCondition:=Me.Filter Else   DoCmd.OpenForm FormName:="F2" End If のように。

  • Gin_F
  • ベストアンサー率63% (286/453)
回答No.1

> そのままF1を開いた状態でF2を開くと、 F1に作成したコマンドボタンから、F2を開くということでいいのでしょうか? であれば、OpenForm メソッドの、WhereCondition 引数を使えばいいですね。 DoCmd.OpenForm FormName:="F2" _         , WhereCondition:=Me.Filter のようにしてみてください。

itodai777
質問者

補足

すいません、補足します。 MDBを開いたら、メインのフォーム(F3)があり、 そのF3は、どのフォーム(F1 or F2)を開くか選択できるよう(btnF1、btnF2)になってます。 で、btnF1を押してF1フォームを開いてフィルタをかけて btnF2でF2フォームを開くと、件数が絞れてればOKです。 実はF1、F2と書きましたが、フォームは全部で10個あり、どのフォームを最初に開くか解らないのです(その都度変わります)。

関連するQ&A

専門家に質問してみよう