Microsoft Access 掲示板

データシートビューにするのが良いのか / 3

11 コメント
views
4 フォロー
3
hiroton 2020/09/24 (木) 16:06:09 7c0ec@f966d

構想だけ

フォームヘッダーの部分って列のラベル表示とかしていますか?
この部分にコントロールを2つ重ねて
下:テキストボックス(コンボボックス)でフィルタ用
上:テキストボックスでラベル表示用

両方ともタブストップを「しない」
ラベル用コントロールでフォーカス取得時にフィルタ用にSetFocus
コントロールソースは「="ラベル名"&IIf([フィルタ用]<>"","▼","▽")

これで少しはそれっぽい見た目になるんじゃないかと思います

通報 ...
  • 4
    セロハン 2020/09/24 (木) 22:11:37 0029a@1c915 >> 3

    なるほど、そういう手もありますね。
    右クリック、コンボボックス、データシートビュー、
    3つの可能性から検討していきたいと思います。
    ありがとうございました!

  • 8
    セロハン 2020/10/03 (土) 23:27:54 0029a@1c915 >> 3

    2種類、検索をヘッダーに作りたいページがあり、1つはhatena様に教えていただいた方法、もう1つはコンボボックスが多いのでhiroton様に教えていただいた方法を使わせていただくことにしました!
    そこで質問です。
    ①「="ラベル名"&IIf([フィルタ用]<>"","▼","▽")」なのですが、
    フィルタ用の部分は何を指定するイメージでしょうか。
    わからず…スミマセン。

    ②「フォーカス取得時にフィルタ用にSetFocus」という意図は
    下記ですよね。

    '''Private Sub txt検索_GotFocus()
        Me.cbo検索.SetFocus
    End Sub
    '''

    ③絞り込みは重ねていくことはできますでしょうか。

    色々聞いてスミマセン。宜しくお願いいたします。

  • 9
    hiroton 2020/10/04 (日) 22:57:03 4e4b1@358c8 >> 3

    イメージしてるものに齟齬があるような気がしないでもないですが

    ①「="ラベル名"&IIf([フィルタ用]<>"","▼","▽")」なのですが、

    hatenaさんのブログのサンプルを例にとるならば
    ="社員コード"&IIf([txt社員コード]<>"","▼","▽")

    ="フリガナ"&IIf([txtフリガナ]<>"","▼","▽")
    みたいな感じです。フィルタをかけているフィールド(列)は「▽」が「▼」になって区別できるという仕組みです

    ②「フォーカス取得時にフィルタ用にSetFocus」という意図は

    フォーカス取得時EnterですねGotFocusでもほぼ変わらないのでどちらでもいいですが

    ③絞り込みは重ねていくことはできますでしょうか。

    ちょっと質問の内容が理解できていません。フィルタの仕組み自体はhatenaさんのブログにあるような、フィールド(列)毎にフィルタ用のテキストボックス(またはコンボボックス)を用意するというだけのものです


    この方法の問題点
    フォーカスのあるコントロールは最前面に表示されるという仕様を使っているので期間指定(min、maxでテキストボックスを2つ用意したい)みたいなのはどうしたもんかとなります


    ▽(▼)について
    上で軽く触れましたが、フィルタの内容を入力するテキストボックス(コンボボックス)は基本的にフィールド(列)のラベルに隠れた状態になるのでフィルタを適用しているフィールド(列)がどこなのかぱっと見でわかるようにするためのものです。この部分だけ独立させるとサイズやフォントを変えたり右端に寄せたりしてもう少しExcelっぽくできそうな気もします
    条件付き書式を使ってみるという手もあるかもしれません


    VBAの実装について
    フィールド(列)のラベルとして使うコントロールを例えば「列ラベル_txt社員コード」のようにしたとすると

    Private Sub 列ラベル_txt社員コード_Enter()
        Me.txt社員コード.SetFocus
    End Sub
    

    のようになりますが、コントロール数分記述するのは手間だしVBAコードが見づらくなります。フィルタの内容を入力するコントロールを例えばすべて「フィルタ_○○」のように統一して

    Private Function setFocusFilterControl()
        Me(Replace(Me.ActiveControl.Name,"列ラベル_","フィルタ_")).SetFocus
    End Sub
    

    のような関数を作るとフォーカス取得時イベントに[イベントプロシージャ]を指定してコードを記述する代わりに=setFocusFilterControl()を設定するだけで済むのでいろいろはかどります

    10
    セロハン 2020/10/06 (火) 09:08:34 0029a@1c915 >> 9

    詳しく教えていただき、ありがとうございます!
    じっくり確認させていただき、不明点があった場合は改めて質問させていただきます。
    ③の質問については、hatena様のVBAで作成できますよね…大変失礼いたしました。VBAで実行可能なことは承知の上で、1個質問です。
    クエリデザインで作成することは可能でしょうか?不可能であれば諦めがつくので教えていただけると幸いです。可能だとすると、コンボボックスに工夫が必要になりますでしょうか。だとすると、VBAのほうが楽でしょうか。
    ※帳票スタイルのリストに対して、フィールドごとにコンボボックスがあり、複数の絞り込み条件を重ねる際、クエリデザインで設計できるか?という質問です。わかりづらくてスミマセン

  • 11
    hiroton 2020/10/06 (火) 10:33:04 589a0@f966d >> 3

    フィルタ用のテキストボックス、コンボボックスが空白の時の処理を考える必要があります
    VBAの場合、

    If Not IsNull(Me!txt社員コード) Then
        strFilter = " AND 社員コード='" & Me!txt社員コード & "'"
    'Else
    '//なにもしない
    End If
    

    この形で「そもそもフィルタリングしない」を選べますが、クエリデザインの場合「必ず何かしらの抽出条件を設定する」ことになるため任意のフィールドでフィルタリングするようなのはひと手間必要です

    ■コンボボックスが片方空っぽでも(魔法使いの開発工房さん)

    または、Nullを許可しないフィールド限定になりますが

    ex)
    フィールド:社員コード
    抽出条件:Nz([forms]![フォーム名]![txt社員コード],[社員コード])
    

    というような方法もあります
    そもそもNullを抽出したい場合にはIs Nullと指定する必要がある。なんかもVBAなら柔軟に処理できるメリットがありますね


    慣れの問題なのでどちらが楽かとは一概に言えないですが、余計な処理をしない点でVBAのほうがより良いものです