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の操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。

サービス一覧

最後までお読みいただき、ありがとうございました。