データシートで表示されている状態
MicroSoft Access でテーブルやクエリを開いて、フィルターをかけるという経験はあると思います。
クエリのデータをフィルター処理する
フィルターを適用して選択したレコードを Access データベースに表示する
フィルターが有効な場合
フィルターの適用後に取得したビューには、選択した値を持つレコードのみが表示されるため、残りのデータはフィルターをクリアするまで非表示のままになります。
注: 式に連結されたフォームおよびレポート内のデータシートとコントロールの列は、フィルターをサポートしていません。
フィルターは簡単に適用したり削除したりできます。Access 2010 では、すべてのビューに一般的なフィルターが組み込まれています。フィルター コマンドを使用できるかどうかは、フィールドの種類と値によって決まります。
たとえば、特定の月に誕生日を迎える人のレコードを表示するには、[ホーム] タブの [並べ替えとフィルター] で [生年月日] 列をクリックし、[日付フィルター] をクリックして、必要な期間を選択します。
Excelだとオートフィルターが似た機能ですね。
オートフィルタを使い倒す - Office Tanaka
Accessのフィルタの欠点
一度かけたフィルタは解除しないと新しいフィルタにならない
そのままだと絞り込みになります。
複数の列に欠けたフィルタを一気に解除する方法がない
これらの欠点がAccessを使いにくくしています。
これらを解決するためにマクロとVBAを使う。
マクロに登録すると、クィックアクセスツールバーに登録できます。
ExcelはALT+F8でマクロの一覧を出せます(もちろんマクロを有効にしてください)
Accessはこの方法がたぶんありません。
しかし、VBAを組み、マクロに登録することによってそれが可能となります。
かけた条件をメモする
しかしただ解除するだけでは、またかけるとき大変です。
そこで、解除するときに、今かけてあるフィルタのクエリをイミディエイトに書きだします。
イミディエイトのクエリで一気にフィルタをかけなおすマクロも用意する。
Function Macro_Off_TBlQryFilter()
Call Off_TBlQryFilter
End Function
Sub Off_TBlQryFilter()
' テーブル、クエリにかかっているフィルタを解除する
' ただし解除する前にフィルターの文字列を表示する
Dim cDB As DAO.Database: Set cDB = CurrentDb
Dim acObj As AccessObject
Dim acScr As Screen
Dim str As String
Set acScr = Application.Screen
str = acScr.ActiveDatasheet.Filter
If str <> "" Then
Debug.Print "DoCmd.ApplyFilter , " & """" & Replace(acScr.ActiveDatasheet.Filter, Chr(34), Chr(34) & Chr(34), 1, -1, vbTextCompare) & """"
Debug.Print acScr.ActiveDataSheet.Filter
acScr.ActiveDatasheet.FilterOn = False
End If
End Sub
これをVBAのモジュールに貼り付けます。
新しいマクロを一個作成し、デザイン画面にします。
そしてプロシージャの実行を選択し、
Macro_WhatCurrentObjectFilter()
といれます。かっこが必要です。
登録した後名前を
A01フィルタ解除
とします。英語だと A01FltReleaseでしょうか。
個人的なテクニック
マクロに登録するための関数は全てMacro_サブプロシージャ名にしています。
オートで候補が出てきますが、このときわかりやすいからです。
単純に今フィルタがかかっているテーブルまたはクエリのデータシートのフィルタ式を調べる
Function Macro_WhatCurrentObjectFilter()
Call WhatCurrentObjectFilter
End Fuction
Sub WhatCurrentObjectFilter()
'Access カレントのテーブルにかかっているフィルターをイミディエイトに表示する
Dim cDB As DAO.Database: Set cDB = CurrentDb
Dim acObj As AccessObject
Dim acScr As Screen
Dim str As String
Set acScr = Application.Screen
str = acScr.ActiveDatasheet.Filter
If str <> "" Then
Debug.Print acScr.ActiveDatasheet.Filter
Else
Debug.Print "No Filter"
End If
End Sub
クエリ式をインプットボックスから入力して一気にフィルタをかけるマクロ