現在、帳票でほとんど編集ロックでリストを見せているフォームがあります。
要はエクセルのように一覧化して見せたいページになります。
※行列共に多い。列数は画面の横幅1.5倍ほど。行ごとに詳細ページへ飛ぶボタンなどがある。
インターフェースは気に入っているのですが、エクセルのように簡単にフィルタリングできないのがネックだと感じるようになりました。
そこでサブフォームにしてデータシートを組み込みましたが、いまいち見た目がきれいに仕上がりません。
ぼんやりした悩みで誠に申し訳ないのですが、何か良い方法はありませんでしょうか。
通報 ...
テキストボックス上で右クリックすれば、並べ替えとかフィルターのメニューが出ますがそれでは不足ですか。
あるいは、リボンの「並べ替えとフィルター」セクションの「詳細設定」の「フォームフィルター」だと複数のフィールドの条件をまとめて設定できます。
あとは、VBAでフィルター処理を作りこめば自由に思い通りのUIが構築できます。
例えば、下記のような感じです。
複数条件の抽出フォームの設計 その1 - hatena chips
フィルタリングに関してはエクセルよりデータベースであるアクセスの方が高機能、高速ですので、それが目的でエクセルに移行するのはもったいないと思います。
>テキストボックス上で右クリックすれば、並べ替えとかフィルターのメニューが出ますが
本当ですね!知りませんでした。ありがとうございます。
>VBAでフィルター処理を作りこめば
ページの上の領域を結構使ってしまうのが気になっております。
別ウィンドウのポップアップで検索するフォームも別のところで作ってみたのですが
やはりいまいち使い勝手がいいとは言えなくて、あれもこれも欲張るのは難しいですね・・
>エクセルに移行するのはもったいないと
そうですよね。エクセルに移行しようとは思っていないのですが、
アクセスの「データシートビュー」のが、エクセルライクでユーザーにもわかりやすいので悩んでおりました。
ただ、見栄えがあまりよくなくて…
テキストボックスの右クリックをユーザーにわかりやすく告知できないか考えてみようかと思います。
構想だけ
フォームヘッダーの部分って列のラベル表示とかしていますか?
この部分にコントロールを2つ重ねて
下:テキストボックス(コンボボックス)でフィルタ用
上:テキストボックスでラベル表示用
両方ともタブストップを「しない」
ラベル用コントロールでフォーカス取得時にフィルタ用にSetFocus
コントロールソースは「
="ラベル名"&IIf([フィルタ用]<>"","▼","▽")
」これで少しはそれっぽい見た目になるんじゃないかと思います
なるほど、そういう手もありますね。
右クリック、コンボボックス、データシートビュー、
3つの可能性から検討していきたいと思います。
ありがとうございました!
2種類、検索をヘッダーに作りたいページがあり、1つはhatena様に教えていただいた方法、もう1つはコンボボックスが多いのでhiroton様に教えていただいた方法を使わせていただくことにしました!
そこで質問です。
①「="ラベル名"&IIf([フィルタ用]<>"","▼","▽")」なのですが、
フィルタ用の部分は何を指定するイメージでしょうか。
わからず…スミマセン。
②「フォーカス取得時にフィルタ用にSetFocus」という意図は
下記ですよね。
'''Private Sub txt検索_GotFocus()
Me.cbo検索.SetFocus
End Sub
'''
③絞り込みは重ねていくことはできますでしょうか。
色々聞いてスミマセン。宜しくお願いいたします。
イメージしてるものに齟齬があるような気がしないでもないですが
hatenaさんのブログのサンプルを例にとるならば
="社員コード"&IIf([txt社員コード]<>"","▼","▽")
や
="フリガナ"&IIf([txtフリガナ]<>"","▼","▽")
みたいな感じです。フィルタをかけているフィールド(列)は「▽」が「▼」になって区別できるという仕組みです
フォーカス取得時はEnterですねGotFocusでもほぼ変わらないのでどちらでもいいですが
ちょっと質問の内容が理解できていません。フィルタの仕組み自体はhatenaさんのブログにあるような、フィールド(列)毎にフィルタ用のテキストボックス(またはコンボボックス)を用意するというだけのものです
この方法の問題点
フォーカスのあるコントロールは最前面に表示されるという仕様を使っているので期間指定(min、maxでテキストボックスを2つ用意したい)みたいなのはどうしたもんかとなります
▽(▼)について
上で軽く触れましたが、フィルタの内容を入力するテキストボックス(コンボボックス)は基本的にフィールド(列)のラベルに隠れた状態になるのでフィルタを適用しているフィールド(列)がどこなのかぱっと見でわかるようにするためのものです。この部分だけ独立させるとサイズやフォントを変えたり右端に寄せたりしてもう少しExcelっぽくできそうな気もします
条件付き書式を使ってみるという手もあるかもしれません
VBAの実装について
フィールド(列)のラベルとして使うコントロールを例えば「列ラベル_txt社員コード」のようにしたとすると
のようになりますが、コントロール数分記述するのは手間だしVBAコードが見づらくなります。フィルタの内容を入力するコントロールを例えばすべて「フィルタ_○○」のように統一して
のような関数を作るとフォーカス取得時イベントに[イベントプロシージャ]を指定してコードを記述する代わりに
=setFocusFilterControl()
を設定するだけで済むのでいろいろはかどります詳しく教えていただき、ありがとうございます!
じっくり確認させていただき、不明点があった場合は改めて質問させていただきます。
③の質問については、hatena様のVBAで作成できますよね…大変失礼いたしました。VBAで実行可能なことは承知の上で、1個質問です。
クエリデザインで作成することは可能でしょうか?不可能であれば諦めがつくので教えていただけると幸いです。可能だとすると、コンボボックスに工夫が必要になりますでしょうか。だとすると、VBAのほうが楽でしょうか。
※帳票スタイルのリストに対して、フィールドごとにコンボボックスがあり、複数の絞り込み条件を重ねる際、クエリデザインで設計できるか?という質問です。わかりづらくてスミマセン
フィルタ用のテキストボックス、コンボボックスが空白の時の処理を考える必要があります
VBAの場合、
この形で「そもそもフィルタリングしない」を選べますが、クエリデザインの場合「必ず何かしらの抽出条件を設定する」ことになるため任意のフィールドでフィルタリングするようなのはひと手間必要です
■コンボボックスが片方空っぽでも(魔法使いの開発工房さん)
または、Nullを許可しないフィールド限定になりますが
というような方法もあります
そもそもNullを抽出したい場合には
Is Null
と指定する必要がある。なんかもVBAなら柔軟に処理できるメリットがありますね慣れの問題なのでどちらが楽かとは一概に言えないですが、余計な処理をしない点でVBAのほうがより良いものです
データシートビュー表示がいいのなら、サブフォームにデータシートフォームを埋め込んで、
フィルター用のテキストボックスやコマンドボタンは普段は閉じておいて、ボタンクリックで開くようにするというのはどうでしょうか。
言葉では分かりにくいと思いますので、サンプルを作成しましたので、参考にしてみてください。
FrmFilter_1_1.accdb
データを確認させていただきました!素晴らしいですね!この方式で作ってみたいと思います。
ありがとうございました!!
気に入っていただけて良かったです。
簡単に解説をしておきます。
フィルター関係のコードは下記のものとほぼ同じで、最後の Filter、FilterOn を設定するところを、サブフォームのものに変更しただけです。
複数条件の抽出フォームの設計 その1 - hatena chips
非連結のメインフォームの詳細セクションに、上記のフォームヘッダーのコントロール群を配置します。
その下に、データシートビュー表示のサブフォームを配置します。
サブフォームコントロールの幅は詳細セクションの幅と同じにします。
また、「水平アンカー」「垂直アンカー」プロパティをどちらも「両方」に設定します。
これでメインフォームをリサイズしても、それにあわせて拡大/縮小します。
フォームを開く時に、サブフォームの最上部へ移動、高さもフィルターのコントロール群を覆える高さにします。
また、詳細セクションの高さもそれに合わせます。
フォームヘッダーに「フィルターを開く」ボタンを配置して、それで、
サブフォームの位置、詳細セクションの高さを変更して、フィルターのコントロール群をサブフォームの裏に隠したり、見えるようしています。
もし、ご不明な点がありましたら、追加質問してください。