• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:フィルタの情報を保存したい)

Accessフォームでフィルタの情報を保存する方法

このQ&Aのポイント
  • 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」のコードを使用してフォームの情報を保存する必要があります。これにより、再度開きなおした際に最後に適用したフィルタが表示されるようになります。以上の手順を実行することで、フィルタの情報を保存し、再度開きなおしても正しく表示されるようにすることができます。

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

  • ベストアンサー
  • piroin654
  • ベストアンサー率75% (692/917)
回答No.3

すみません。訂正です。 >フォームを閉じる前にフィルタを解除したのなら、 >再度フォームを開いたときはフィルタが解除された状態にしたいです。 この部分処理が抜けていました。 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)の部分を抜かしていました。

lkj23lkj
質問者

お礼

varKeyと言う変数に値を保持する作戦ですね。 わざわざ私のコントロール名に書き換えて頂きありがとうございます。 うまくいきました。

その他の回答 (4)

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.5

#4です 補足です #4ではフィルタ情報しか覚えていないので、 条件を作るために使用したテキストボックスの表示に変化はありません。 (Null なら Null のままです)

lkj23lkj
質問者

お礼

ありがとうございます。

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.4

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 = で良いと思います。

lkj23lkj
質問者

お礼

ありがとうございます。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.2

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 以上です。

lkj23lkj
質問者

お礼

3つ目の回答に記載します。

  • piroin654
  • ベストアンサー率75% (692/917)
回答No.1

たとえば、フォームの検索用のテキストボックスを参照してその値 でフィルタをかけて、「氏名」を検索しているとすると、 そのテキストボックスの名前を「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) 閉じるときは何も設定しません。 一応、勘違いをしていなければの回答ですが。 分からないところがあれば補足してください。

lkj23lkj
質問者

お礼

3つ目の回答に記載します。

関連するQ&A

専門家に質問してみよう