ACCESS サブフォームで検索を行う方法
ACCESSのフォームには、サブフォームという、別のフォームを内部に表示する機能があります。
レコードソースが異なるフォームを一つのフォーム内で表示できるので非常に便利な機能です。
今回は、そんなサブフォームに対して、メインフォームから検索を行う方法をご紹介します。
こんにちは。
はこにわガジェット (@hakoniwagadget) です。
ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは使いこなすために少しスキルが必要なものの、うまく活用すればExcelよりも業務の効率化が図れます。
この記事ではACCESSで実際に作成したフォームやレポートを、その作成方法と共にご紹介していきます。
メインフォームからサブフォームのフィルター
フォームで検索を行う際、メインフォームからサブフォームにフィルターを行うには、VBAで以下の記述をします。
Me!サブフォーム名.Form.Filter = フィルター条件
操作しているフォーム自身にフィルターを適用する場合はMe.Filterを使いますので、その変化形ですね。
サブフォーム名のあとに.Formを付けることでフィルタープロパティが適用できるようになるのでご注意ください。
サンプルフォーム
では、実際のフォームでどのように作成するか見ていきましょう。
今回は説明用に以下のフォームを準備しました。
売上情報を検索するフォームです。
デザインビューで見ると以下の構成になっています。
上段の検索部分はメインフォームに、下段の一覧表部分はサブフォームになっています。
上段で検索条件を入力して、「検索」ボタンを押すことで、下段のサブフォームで検索結果が表示されるようにしています。
VBAプログラミング
では、どのように実装しているか見てみましょう。
上記のフォームで検索ボタンのクリック時イベントには以下のイベントプロシージャが設定されています。
Dim filter_txt As String
Private Sub 検索_ボタン_Click()
filter_txt = ""
'FROM、TOの前後不備チェック
If Me!売上日検索FROM <> "" And Me!売上日検索TO <> "" Then
If Me!売上日検索FROM > Me!売上日検索TO Then
MsgBox "期間指定が不適切です。再度入力してください。", vbCritical + vbOKOnly, "期間指定不備"
Exit Sub
End If
End If
'売上期間
If Me!売上日検索FROM <> "" Then
If Me!売上日検索TO <> "" Then
filter_txt = "処理日 >= #" & Me!売上日検索FROM & "# and 処理日 <= #" & Me!売上日検索TO & "#"
Else
filter_txt = "処理日 >= #" & Me!売上日検索FROM & "#"
End If
ElseIf Me!売上日検索TO <> "" Then
filter_txt = "処理日 <= #" & Me!売上日検索TO & "#"
End If
'顧客名
If Me!顧客名検索 <> "" Then
If filter_txt = "" Then
filter_txt = "顧客名 like '*" & Me!顧客名検索 & "*'"
Else
filter_txt = filter_txt & " and 顧客名 like '*" & Me!顧客名検索 & "*'"
End If
End If
'商品名
If Me!商品名検索 <> "" Then
If filter_txt = "" Then
filter_txt = "商品名 like '*" & Me!商品名検索 & "*'"
Else
filter_txt = filter_txt & " and 商品名 like '*" & Me!商品名検索 & "*'"
End If
End If
'未請求
If Me!未請求検索 = True Then
If filter_txt = "" Then
filter_txt = "請求済 = false"
Else
filter_txt = filter_txt & " and 請求済 = false"
End If
End If
'削除
If Me!削除検索 = False Then
If filter_txt = "" Then
filter_txt = "削除 = false"
Else
filter_txt = filter_txt & " and 削除 = false"
End If
End If
If filter_txt = "" Then
Me!T_売上検索サブフォーム.Form.FilterOn = False
Else
Debug.Print filter_txt
Me!T_売上検索サブフォーム.Form.Filter = filter_txt
Me!T_売上検索サブフォーム.Form.FilterOn = True
Me!T_売上検索サブフォーム.Form.OrderBy = "処理日 DESC"
Me!T_売上検索サブフォーム.Form.OrderByOn = True
End If
End Sub
メインフォームで指定した条件をfilter_txtという変数に格納してフィルター分を作成していきます。
サブフォームにFilterを適用しているのは最後の部分です。
Me!T_売上検索サブフォーム.Form.Filter = filter_txt
Me!T_売上検索サブフォーム.Form.FilterOn = True
で、サブフォームに設定した抽出条件でのフィルターを適用し、FilterOn = Trueでフィルターを有効化しています。
以上、サブフォームで検索を行う方法をご紹介しました。
ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。
そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。
ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。
最後までお読みいただき、ありがとうございました。