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」のコードを使用してフォームの情報を保存する必要があります。これにより、再度開きなおした際に最後に適用したフィルタが表示されるようになります。以上の手順を実行することで、フィルタの情報を保存し、再度開きなおしても正しく表示されるようにすることができます。
- ベストアンサー
フィルタの情報を保存したい
Me.Form.Filter = "" Me.Form.FilterOn = を保存したいのですがどうすればいいでしょうか? フォームにテキストのフィールドと 抽出とクリアのコマンドボタンを設置して、フィルタをかけたり解除したりしています。 途中でフォームを閉じても最後にフィルタをかけたなら、 再度フォームを開いたときに最後に検索したワードでフィルタが開く用にしたいし フォームを閉じる前にフィルタを解除したのなら、 再度フォームを開いたときはフィルタが解除された状態にしたいです。 Private Sub cmd_クリア_Click() Me.Form.Filter = "" Me.Form.FilterOn = False DoCmd.Save acForm, Me.Name End Sub Private Sub cmd_抽出_Click() Me.Form.Filter = "フィールド2 like '*" & Me.txt_フィールド2テキスト.Value & "*" & "'" Me.Form.FilterOn = True DoCmd.Save acForm, Me.Name End Sub としてるのに、フィルタの情報が保存されてません。 再度開きなおしたときは、 必ず全レコードが表示されてしまいます。 フィルタの状態を保存する方法を教えてください。ご回答よろしくお願いします。
- lkj23lkj
- お礼率100% (34/34)
- オフィス系ソフト
- 回答数5
- ありがとう数5
- みんなの回答 (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つ目の回答に記載します。
関連するQ&A
- フィルターの文字列を空にしたいのですが
親フォームからサブフォームを閉じる時に、フィルターの文字列を空にしたいのですが Private Sub Form_Close() Me.Controls("F_SubMain").Form.Filter = Empty DoCmd.Save acForm, Me.Name MsgBox Me.Controls("F_SubMain").Form.Filter DoCmd.ShowToolbar "Ribbon", acToolbarYes End Sub としても、フィルターの文字が残ってしまいます。 親フォームにサブフォームに入れてるので、 そのサブフォームのフィルタの文字列を空白にしたいのですが DoCmd.Save acForm, Me.Name で保存できないようなのですが DoCmd.Save acForm, Me.Controls("F_SubMain").Form もエラーになりました。 こういうことをやりたい場合、どうすればいいでしょうか?
- ベストアンサー
- オフィス系ソフト
- Me.FilterOn = True は先でも後で
Me.FilterOn = True は先でも後でも問題ないですか? アクセスのvbaでフォームにフィルタをかけるときに 今まで --------------------------------------- Private Sub コマンド2_Click() Me.Filter = "フィールド = '" & "test" & "'" Me.FilterOn = True End Sub --------------------------------------- とコードを書いていましたが --------------------------------------- Private Sub コマンド2_Click() Me.FilterOn = True Me.Filter = "フィールド = '" & "test" & "'" End Sub --------------------------------------- でも機能しました。 という事は、 Me.FilterOn = Trueは Me.Filter の前でも問題ないのでしょうか? Me.FilterOn = Trueは Me.Filter の後と習ったので疑問に思っています。 よろしくお願いいたします。
- ベストアンサー
- オフィス系ソフト
- クリックイベントなのに、2回クリックしないとフォー
クリックイベントなのに、2回クリックしないとフォームが閉じないです。 フォームに閉じると言うコマンドボタンがあり、クリックイベントで Private Sub cmd_閉じる_Click() DoCmd.Close acForm, Me.Name End Sub としてるのですが、なぜか1回ボタンを押しただけではフォームが閉じません。 2回目押した時にフォームがとじます。 ダブルクリックでも閉じます。 Private Sub cmd_閉じる_Click() 'DoCmd.Close acForm, Form_Fフォーム.Name End Sub のように、フォーム名を指定すると1回のクリックで閉じます。 しかしMe.Nameだと2回目じゃないと閉じない理由がわかりません。 Fフォームは他フォームから DoCmd.OpenForm Form_Fフォーム.Name, acNormal で開いたから2回クリックしないと閉じないのでしょうか?
- ベストアンサー
- オフィス系ソフト
- アクセス Between Andの使い方 日付型
フォームをテーブルに紐づけて コマンドボタンを押下したら、日付にフィルタをかけたいのですが、 0件で抽出されます。 フィールド1 2013/05/19 2013/05/20 2013/05/21 というテーブルがあり、 フォーム上のコマンドボタンのクリックイベントは Private Sub コマンド1_Click() Me.Form.Filter = "フィールド1 Between " & Date & " And " & Date + 1 Me.Form.FilterOn = True End Sub です。 2013/05/19 2013/05/20 が抽出されるべきだと思うのですが、なぜ何も抽出されないのでしょうか? エラーにもなりません。
- ベストアンサー
- オフィス系ソフト
- 両方の条件でフィルターをかけたいです
こんにちは。 今、フォームに別々に条件を指定し、抽出するようにしております。 (1) Private Sub コマンド65_Click() DoCmd.ApplyFilter , "[会場名] like '*" & Me.テキスト63 & "*' " Me.FilterOn = True Exit Sub Err_コマンド65_Click: MsgBox Err.Description End Sub (2) Private Sub コマンド70_Click() f_status = "施工日 >= '" & 開始日 & "'" f_status = f_status & " AND 施工日 <= '" & 終了日 & "'" Me.Filter = f_status Me.FilterOn = True End Sub 今の状態では正常に動くのですが、 条件が、(1)かつ(2)という条件でフィルターをかけなければ ならない、と作成してから気づきました。 いろいろやってみたのですが、 どれもエラーになるばかりで。。。
- ベストアンサー
- その他(データベース)
- 日付型と文字列型、両方にフィルタをするには
アクセス フォームで日付型(Between and)と文字列型、両方にフィルタをするには? Private Sub cmd_ボタン1_Click() Me.Form.Filter = _ "日付 Between #" & Me.cmb_日付1.Value & "# And #" & Me.cmb_日付2.Value & "#" & _ " and 会社名 like " & "*" & Me.cmb_会社名.Value & "*" Me.Form.FilterOn = True End Sub これのどこが変なのか教えていただけますか? 実行時エラー3075「クエリ式の構文エラー:演算子がありません。」というエラーになります。
- ベストアンサー
- オフィス系ソフト
- 実行時エラー '3464': 抽出条件でデータ型が
フォームにフィルタをかけようとすると 実行時エラー '3464': 抽出条件でデータ型が一致しません。 になります。 Private Sub Form_Load() Me.Form.Filter = "フィールド1 =200" Me.Form.FilterOn = True End Sub コードはこれです。 フィールド1はテキスト型です。 何がダメなのでしょう?
- ベストアンサー
- オフィス系ソフト
- サブフォームにフィルタをかけたい
サブフォームにフィルタをかけたいのですが エラーになってしまいます。 下記がエラー内容です。 ---------------------------------------------------------- 実行時エラー 438 オブジェクトは、このプロパティまたはメソッドをサポートしていません。 ---------------------------------------------------------- 細かい概要は テーブル1にフィールドがあり、 レコードには「あああ」と入力されています。 テーブル1がレコードソースとされている「フォーム(2)」をサブフォームとして 親フォーム(フォーム名:フォーム(1))に乗せました。 フォーム(1)を開いた時にフォーム(2)にフィルタをかけたいのですが うまくいきません。 オブジェクト名にカッコを付けているため、 Form_フォーム・・・・ というコードは書けないので ---------------------------------------------------------- Private Sub Form_Open(Cancel As Integer) Forms("フォーム(1)").Controls("フォーム(2)").Form.Filter = "フィールド = '" & "*あ*" & "'" Forms("フォーム(1)").Controls("フォーム(2)").FilterOn = True End Sub ---------------------------------------------------------- としています。 Forms("フォーム(1)").Controls("フォーム(2)").FilterOn = True でエラーになりますが、 この行をなくしたら、フィルタがかかりません。 どうすればサブフォームにフィルタをかける事が出来るのでしょうか? ご教示よろしくお願い致します。
- ベストアンサー
- オフィス系ソフト
- Access 2003 でフォームフィルターがかかりません。
Access 2003 でフォームフィルターがかかりません。 どなたか助けてください。 アクセス初心者です。 フォームの詳細欄にチェックボックス(フィールド名:伝票チェック)を配置しております。 チェックの入っていないものを表示させたいです。 フォームヘッダーのオプショングループ(フレーム67)に オプションボタン0-オプション値0と オプションボタン2-オプション値2 の2個のオプションボタンを配置してあります。 クリック時のイベントプロシージャに以下のコードを書きました。 Private Sub フレーム67_Click() If Me!フレーム67 = 0 Then Me.Filter = 伝票チェック = 0 Me.FilterOn = True Else Me.Filter = "" Me.FilterOn = True End If End Sub 実行時エラーは出ませんが、データが何も表示されません。 どうすればいいのでしょう??? どなたかお願いします。
- ベストアンサー
- その他(データベース)
- アクセスOpenForm 引数FilterName
テーブルをレコードソースとしているフォームがあるのですが そのテーブルのtestフィールドに値がいくつかはいっていて、「い」と言う値を抽出した状態で フォームを開きたいのですが Sub test() DoCmd.OpenForm "フォーム1", acNormal, "test ='い'" End Sub これは、意味がないのですか? このコードを実行してフォームを開いても、 testにフィルタは適用されない状態で開きます。 また、ヘルプのFilterNameの項目を見ると ------------------------------------------- 有効なSQLWHERE句を文字列式で指定します。 ただし、WHEREという語を指定する必要はありません。 ------------------------------------------- と書いてありますが、"test ='い'"と言う記載の仕方は間違っていますか? Private Sub Form_Load() Me.Form.Filter = "test ='い'" Me.Form.FilterOn = True End Sub だと、フィルタが適用されます。 OpenForm メソッドを使ってフィルタを適用する方法を教えてください。
- ベストアンサー
- その他MS Office製品
お礼
varKeyと言う変数に値を保持する作戦ですね。 わざわざ私のコントロール名に書き換えて頂きありがとうございます。 うまくいきました。