- ベストアンサー
Accessフォームでフィルタの情報を保存する方法
- Accessフォームでフィルタをかけたり解除したりする際、フィルタの情報が保存されない問題が発生しています。再度開きなおした際には必ず全レコードが表示されてしまいます。この問題を解決するためには、フォームにテキストのフィールドと抽出とクリアのコマンドボタンを設置し、フィルタの状態を保存する必要があります。
- 具体的な解決方法としては、クリアボタンのコードに「Me.Form.Filter = ""」と「Me.Form.FilterOn = False」というコードを記述し、フィルタを解除して情報を保存する必要があります。また、抽出ボタンのコードには「Me.Form.Filter = "フィールド2 like '*" & Me.txt_フィールド2テキスト.Value & "*"'」と「Me.Form.FilterOn = True」というコードを記述し、テキストフィールドの値を含むフィルタを設定して情報を保存する必要があります。
- さらに、フォームを閉じる際には「DoCmd.Save acForm, Me.Name」のコードを使用してフォームの情報を保存する必要があります。これにより、再度開きなおした際に最後に適用したフィルタが表示されるようになります。以上の手順を実行することで、フィルタの情報を保存し、再度開きなおしても正しく表示されるようにすることができます。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
すみません。訂正です。 >フォームを閉じる前にフィルタを解除したのなら、 >再度フォームを開いたときはフィルタが解除された状態にしたいです。 この部分処理が抜けていました。 No3の、 (4) Private Sub cmd_クリア_Click() Me.FilterOn = False End Sub を、 (4) Private Sub cmd_クリア_Click() Me.FilterOn = False varKey = Null End Sub としてください。 よく見たら、No1では(4)の部分を抜かしていました。
その他の回答 (4)
- 30246kiku
- ベストアンサー率73% (370/504)
#4です 補足です #4ではフィルタ情報しか覚えていないので、 条件を作るために使用したテキストボックスの表示に変化はありません。 (Null なら Null のままです)
お礼
ありがとうございます。
- 30246kiku
- ベストアンサー率73% (370/504)
Access を閉じた時には引き継がなくてよいですか。 (引き継ぎたい場合には、以下の処理をテーブル経由で行う必要があります) 以下を標準モジュールに記述しておきます。 Dim dic As Object Public Sub FilterLoad(frm As Form) Dim v As Variant If (frm.FilterOn) Then Exit Sub If (dic Is Nothing) Then Exit Sub v = dic.Item(frm.Name) If (Not IsArray(v)) Then Exit Sub With frm .Filter = v(0) .FilterOn = v(1) End With End Sub Public Sub FilterSave(frm As Form) If (dic Is Nothing) Then Set dic = CreateObject("Scripting.Dictionary") End If With frm dic.Item(.Name) = Array(.Filter, .FilterOn) End With End Sub フォームの方では、前回のフィルタ情報を使いたい時に Private Sub Form_Load() Call FilterLoad(Me) End Sub のように呼び出します。 また、フィルタ情報を覚えておきたい時に Private Sub Form_Close() Call FilterSave(Me) End Sub のように呼び出します。 フィルタの情報は、Dictionary でフォーム名をキーにして管理します。 なので、何回も Call FilterSave(Me) しても直近のものしか覚えません。 Public Sub FilterLoad(frm As Form) 内では、 ・既に FilterOn = True になっている時には、何もせず戻ります。 何故かというと、フォームが起動された時、既に設定されている・・・・ これは、DoCmd.OpenForm で絞り込み条件を指定したんでしょう・・・・ そちらを有効にしましょうか・・・・(という場合があるかも程度) ・セーブされていなかったら何もせず戻ります。 意図した動きでなかったら、ごめんなさい。 なお、 > Me.Form.Filter = "" > Me.Form.FilterOn = の記述は Me.Filter = "" Me.FilterOn = で良いと思います。
お礼
ありがとうございます。
- piroin654
- ベストアンサー率75% (692/917)
No1です。質問にあるテキストボックス名やボタンの名前を そのまま使うと、 (1) 標準モジュールに Public varKey を貼り付け保存 (2) フォームの読み込み時に Private Sub Form_Load() If Not IsNull(varKey) Then Me.Filter = "フィールド2 Like '*" & varKey & "*'" Me.FilterOn = True End If End Sub (3) Private Sub cmd_抽出_Click() Me.Filter = "フィールド2 like '*" & Me.txt_フィールド2テキスト.Value & "*'" Me.FilterOn = True varKey = Me.txt_フィールド2テキスト.Value End Sub (4) Private Sub cmd_クリア_Click() Me.FilterOn = False End Sub 以上です。
お礼
3つ目の回答に記載します。
- piroin654
- ベストアンサー率75% (692/917)
たとえば、フォームの検索用のテキストボックスを参照してその値 でフィルタをかけて、「氏名」を検索しているとすると、 そのテキストボックスの名前を「tx検索用」とします。 Me.Filter = "氏名 Like ""*" & Me!tx検索用 & "*""" として、フィルタをかけると思います。このようなときに 質問のことをしようと思えば、 (1) 標準モジュールに Public varKey を設定します。 (2) フォームの読み込み時のイベントに、 Private Sub Form_Load() If Not IsNull(varKey) Then Me.Filter = "氏名 Like ""*" & varKey & "*""" Me.FilterOn = True End If End Sub とします。 (3) ボタンクリックで、フィルタをかけるときのイベントに、 Private Sub 検索ボタン_Click() If Not IsNull(Me!tx検索用) Then Me.Filter = "氏名 Like ""*" & Me!tx検索用 & "*""" Me.FilterOn = True varKey = Me!tx検索用 End If End Sub のように設定します。 (3) 閉じるときは何も設定しません。 一応、勘違いをしていなければの回答ですが。 分からないところがあれば補足してください。
お礼
3つ目の回答に記載します。
お礼
varKeyと言う変数に値を保持する作戦ですね。 わざわざ私のコントロール名に書き換えて頂きありがとうございます。 うまくいきました。