アクセス小僧:フィルタリング [コンピューター]
アクセスのフォームで、
指定したフィールドに、特定の文字列を含むレコードを抽出(フィルタリング)するVBAマクロを作りました。
【1】まず、アクセスのフォームに以下の部品を追加します。
・(1) FieldName1 コンボボックス:フィールドを指定します。フィールド名は別にテーブルを作成して、そこを参照します。
・(2) 検索 テキストボックス:フィールドに含まれる文字列を指定します。
・(3) 検索実行 ボタン:レコード抽出を実行するVBAマクロを起動
・(4) 検索フィルタ解除 ボタン:レコード抽出を解除します。
【2】レコード抽出を実行するVBAマクロは次の通りです。
Private Sub 検索実行_Click()
'【変数】
Dim MyStr1 As String ' 文字列
'【実行コード】
Me.AllowAdditions = False '追加の禁止
If [FieldName1].Column(1) = "経過日数" Then
MyStr1 = "経過日数 > " & [検索]
Else
MyStr1 = [FieldName1].Column(1) & " like '*" & [検索] & "*'"
End If
Me.Filter = MyStr1 ' フィルタ設定
Me.FilterOn = True ' フィルタ適用
End Sub
・抽出を実行すると、なぜかレコードが自動追加されてしまうので、Me.AllowAdditions = Falseを入れています。
・経過日数フィールドの場合は、検索テキストボックスに入力した数字より大きい経過日数のレコードを抽出します。
・それ以外のフィールドの場合は、検索テキストボックスに入力した文字列を含むレコードを抽出します。
【3】レコード抽出を解除するVBAマクロは次の通りです。
Private Sub 検索フィルタ解除_Click()
On Error GoTo ERR1
'【変数】
Dim myID As Long ' 主キー
Dim MyStr1 As String ' 文字列
'【実行コード】
myID = [myID1] ' 主キーを退避
Me.AllowAdditions = True '追加の許可
Me.FilterOn = False ' フィルタ解除
MyStr1 = "myID1 = " & myID
With Me.Recordset
.FindFirst MyStr1
End With
Exit Sub
ERR1:
MsgBox ("エラー(検索フィルタ解除_Click)" & vbCrLf & Err.Description)
End Sub
・抽出を解除する前に主キーを変数に退避します。
・抽出を解除すると、カレントレコードがテーブルの先頭レコードになってしまうため、抽出を解除後、FindFirstで抽出されていたレコードを主キーで検索します。
・禁止していた追加を許可します。(Me.AllowAdditions = True)
【参考Web】
初心者のためのOffice口座
テキストボックスでレコード抽出
https://hamachan.info/win10/access/textbox.html
指定したフィールドに、特定の文字列を含むレコードを抽出(フィルタリング)するVBAマクロを作りました。
【1】まず、アクセスのフォームに以下の部品を追加します。
・(1) FieldName1 コンボボックス:フィールドを指定します。フィールド名は別にテーブルを作成して、そこを参照します。
・(2) 検索 テキストボックス:フィールドに含まれる文字列を指定します。
・(3) 検索実行 ボタン:レコード抽出を実行するVBAマクロを起動
・(4) 検索フィルタ解除 ボタン:レコード抽出を解除します。
【2】レコード抽出を実行するVBAマクロは次の通りです。
Private Sub 検索実行_Click()
'【変数】
Dim MyStr1 As String ' 文字列
'【実行コード】
Me.AllowAdditions = False '追加の禁止
If [FieldName1].Column(1) = "経過日数" Then
MyStr1 = "経過日数 > " & [検索]
Else
MyStr1 = [FieldName1].Column(1) & " like '*" & [検索] & "*'"
End If
Me.Filter = MyStr1 ' フィルタ設定
Me.FilterOn = True ' フィルタ適用
End Sub
・抽出を実行すると、なぜかレコードが自動追加されてしまうので、Me.AllowAdditions = Falseを入れています。
・経過日数フィールドの場合は、検索テキストボックスに入力した数字より大きい経過日数のレコードを抽出します。
・それ以外のフィールドの場合は、検索テキストボックスに入力した文字列を含むレコードを抽出します。
【3】レコード抽出を解除するVBAマクロは次の通りです。
Private Sub 検索フィルタ解除_Click()
On Error GoTo ERR1
'【変数】
Dim myID As Long ' 主キー
Dim MyStr1 As String ' 文字列
'【実行コード】
myID = [myID1] ' 主キーを退避
Me.AllowAdditions = True '追加の許可
Me.FilterOn = False ' フィルタ解除
MyStr1 = "myID1 = " & myID
With Me.Recordset
.FindFirst MyStr1
End With
Exit Sub
ERR1:
MsgBox ("エラー(検索フィルタ解除_Click)" & vbCrLf & Err.Description)
End Sub
・抽出を解除する前に主キーを変数に退避します。
・抽出を解除すると、カレントレコードがテーブルの先頭レコードになってしまうため、抽出を解除後、FindFirstで抽出されていたレコードを主キーで検索します。
・禁止していた追加を許可します。(Me.AllowAdditions = True)
【参考Web】
初心者のためのOffice口座
テキストボックスでレコード抽出
https://hamachan.info/win10/access/textbox.html
2017-10-07 09:08
ヤバイぜ!(10)
コメント(1)
ヤバイぜ! ありがとうございます[__猫]
抽出解除後、なぜFindFirstで検索するのか、説明を追記しました。
by cheese999 (2017-10-07 12:04)