Access VBAで複数条件の検索フォームを作る

スポンサーリンク
スポンサーリンク

Accessで複数条件の検索フォームを作る

サブフォームにクエリーを紐づけておいて検索条件をVBAで編集する手法についてご紹介します。

注意点は、1つのAccessフォームを複数人で起動して操作すると検索結果が上手く表示されない事があります。

基本的にAccessはフォームの実態は各々のPCに配置し、データ部分のみ共有するような作りを取るのが一般的となっています。

使用するもの
・テーブル:工事一覧テーブル(名前はなんでも)
・クエリー:Q_工事一覧
・フォーム:F_D工事一覧、F_D工事一覧_明細

検索フォームの完成イメージ

一覧のサブフォームを作成

最初に一覧に表示したいサブフォームを作成します。

名前:F_D工事一覧_明細

ポイントはレコードソースにクエリーを指定します。
項目は適当に並べていきます。
フォームの種類は帳票フォームになります。

一覧フォームを作成

次に一覧のフォームを作成します。
名前:F_D工事一覧

一覧フォームの詳細の中にサブフォームを追加します。

ソースオブジェクトは「F_D工事一覧_明細」

検索項目を作成

検索項目も配置していきます。

Access VBAの検索フォームのサンプルコード

検索ボタンイベントでの記載例

Public Sub cmd検索_Click()
Dim dbs As Database
Dim qdf As QueryDef
Dim objRs As Recordset
Dim strSql As String
Dim strSqlEdit As String
Dim rsCount     As Double

On Error GoTo Error

    Set dbs = CurrentDb
    Set qdf = dbs.QueryDefs("Q_工事一覧")
    ' クエリーの現在のSQL文を変数にセットし
    strSql = qdf.SQL
    ' WHEREより前を保持
    strSqlEdit = Left(strSql, InStr(strSql, "WHERE") - 1)
    ' 条件文を画面の条件に変更
    strSqlEdit = strSqlEdit & " WHERE ukeymd <> ''"
    
    
    '------------------
    ' 受付日
    '------------------
    If Nz(Me.txt受付日From.Value) <> "" And Nz(Me.txt受付日To.Value) <> "" Then
        strSqlEdit = strSqlEdit & " AND ukeymd >='" & Format(Me.txt受付日From.Value, "yyyymmdd") & "'"
        strSqlEdit = strSqlEdit & " AND ukeymd <='" & Format(Me.txt受付日To.Value, "yyyymmdd") & "'"
    Else
        If Nz(Me.txt受付日From.Value) <> "" And Nz(Me.txt受付日To.Value) = "" Then
            strSqlEdit = strSqlEdit & " AND ukeymd ='" & Format(Me.txt受付日From.Value, "yyyymmdd") & "'"
        End If
        If Nz(Me.txt受付日From.Value) = "" And Nz(Me.txt受付日To.Value) <> "" Then
            strSqlEdit = strSqlEdit & " AND ukeymd ='" & Format(Me.txt受付日To.Value, "yyyymmdd") & "'"
        End If
    End If
    
    '------------------
    ' 工事コード
    '------------------
    If Nz(Me.txt工事コードFrom.Value) <> "" And Nz(Me.txt工事コードTo.Value) <> "" Then
        strSqlEdit = strSqlEdit & " AND koujicd >='" & Me.txt工事コードFrom.Value & "'"
        strSqlEdit = strSqlEdit & " AND koujicd <='" & Me.txt工事コードTo.Value & "'"
    Else
        If Nz(Me.txt工事コードFrom.Value) <> "" And Nz(Me.txt工事コードTo.Value) = "" Then
            strSqlEdit = strSqlEdit & " AND koujicd ='" & Me.txt工事コードFrom.Value & "'"
        End If
        If Nz(Me.txt工事コードFrom.Value) = "" And Nz(Me.txt工事コードTo.Value) <> "" Then
            strSqlEdit = strSqlEdit & " AND koujicd ='" & Me.txt工事コードTo.Value & "'"
        End If
    End If
    
    If Me.txt工事名.Value <> "" Then
        strSqlEdit = strSqlEdit & " AND koujimei Like '*" & Me.txt工事名.Value & "*'"
    End If
    
    If Me.txt顧客名.Value <> "" Then
        strSqlEdit = strSqlEdit & " AND kokyakukjmei Like '*" & Me.txt顧客名.Value & "*'"
    End If    
   
    If Me.txt工事担当名.Value <> "" Then
        strSqlEdit = strSqlEdit & " AND koujitanto Like '*" & Me.txt工事担当名.Value & "*'"
    End If
    
    strSqlEdit = strSqlEdit & " ORDER BY TBL_Koujidata.ukecd DESC , TBL_Koujidata.ukeymd"

    ' クエリー保存
    qdf.SQL = strSqlEdit
    
    ' 再表示
    Me.sub明細.SourceObject = ""
    Me.sub明細.SourceObject = "F_D工事一覧_明細"
    
Exit Sub
Error:
    Application.Echo True
    DoCmd.Hourglass False
    
    MsgBox "エラーが発生しました。エラー内容:" & Err.Description & Chr$(10), vbCritical, "<<中断>>"
End Sub

コード解説

現在のクエリー(Q_工事一覧)を変数にセットしWHEREより前のコードをstrSqlEditに保持しています。
WHEREとは、条件文のことです。
例えば条件なしの場合は、テーブルの全データが表示されます。
データを抽出する上で件数絞り込みはある程度していないと負荷がかかるため
この検索処理の前に入力チェックを実施し必ずこの項目はチェックしてねとさせる事もできます。

日付の条件文での注意点は日付がテーブルにどのようなデータ型なのかにより
ここの日付での条件の記載方法は変わってきます。

If Me.txt工事名.Value <> "" Then
        strSqlEdit = strSqlEdit & " AND koujimei Like '*" & Me.txt工事名.Value & "*'"
End If

あいまい検索をする場合はLikeを使用します。
これも使用しているデータベースによっては*(アスタリスク)ではない場合もあります。
工事名に「あいうえお」と入力されていると条件文は

" AND koujimei Like '*あいうえお*'"

となります。

 qdf.SQL = strSqlEdit

クエリーのSQLをセットしています。

例えばこのような検索をしたとします。

そのあとに、クエリーのSQLを表示してみてください
Q_工事一覧

WHERE ukeymd <> '' AND koujicd >='888888' AND koujicd <='888888' AND koujimei Like '*修繕*'
ORDER BY TBL_Koujidata.ukecd DESC , TBL_Koujidata.ukeymd;

このようになっています。
つまりこのVBAはクエリーを修正していることになります。
また、サブフォームの帳票フォームは、このクエリーを参照しているので条件も絞られて一覧表示されます。

このようにVBAでは、普段手動でポチポチ行っていたことを自動化することができます。
コードを理解して使うことにより作業効率化が可能となります。

コメント

タイトルとURLをコピーしました