Accessで複数条件の検索フォームを作る
サブフォームにクエリーを紐づけておいて検索条件をVBAで編集する手法についてご紹介します。
基本的に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では、普段手動でポチポチ行っていたことを自動化することができます。
コードを理解して使うことにより作業効率化が可能となります。



コメント