概要説明
検索するフォームとは別に検索条件設定フォームを利用して検索する方法。検索条件設定フォームには、検索語を入力するテキストボックスと
検索を実行する検索実行ボタンを設け、検索結果をメインフォームに表示する関係になります。
複数の検索結果が出る場合に備えて、2件目以降への移動用の機能も設けます。
※技術ポイント
- Recordset.FindFirst でのレコード検索
- Recordset.FindNext でのカレントレコード以降の検索
- Bookmarkプロパティを使って、二つのフォーム間の連携をする。
- Do・・・Loop の繰り返し命令を使う
作り方
1.使用するフォーム
フォーム名:「F_名簿」
- フォーム仕様 形式:単票形式 レコードソース:テーブル/クエリ(連結フォーム)
2.検索条件設定フォームの作成
検索条件設定フォームを新規に作ります。フォームは非連結フォームとし、余分な機能を外した仕様にします。 また検索用にテキストボックスとコマンドボタンを設置します。その仕様は次のようにします。
【フォームの仕様】
- 名前:「F_検索条件設定」
- 形式:非連結フォーム スクロールバー:なし レコードセレクト:いいえ 移動ボタン:いいえ 境界線スタイル:細線
【コントロールの設置】
- テキストボックス「Txt_検索条件」 検索語を入力するところ
- 検索実行ボタン「Btn_検索実行」 検索を実行するボタン
- 終了ボタン「Btn_閉じる」 検索フォームを閉じるボタン
- ※各コントロールのラベルは分かりやすい表現にします。
3.検索条件設定フォームに検索機能をつける
※DAOのレコードセットを使います。参照設定で「Microsoft DAO 3.5 Object Liblary」を使えるようにしておいてください。
【検索実行ボタンの機能】
- クリック時イベントのプロシージャを作成します。
(その手順) - デザインモードでフォームを開き、ボタン上で右クリックメニューで「イベントのビルド」をクリック、で「ビルダの選択」画面から「コードビルダ」をクリックします。
- 表示されたVBAエディタの作成されたプロシージャに次のコードを記述します。シングルクォーテーションの文字は説明文ですので、機能には関係ありません。
'まず検索結果が出るフォームを表示します。
DoCmd.OpenForm "F_名簿"
'DAO型のレコードセットを使う関係の変数宣言
Dim db As DAO.Database
Dim rs As DAO.Recordset
'検索語の変数宣言
Dim Keyword As String
'メインフォームのレコードセットのコピーを作る
Set db = CurrentDb
Set rs = Forms!F_名簿.RecordsetClone
'テキストボックスの値を検索語変数に代入
Keyword = Me!Txt_検索条件
'検索語を含むあいまい検索を実行
rs.FindFirst "氏名 like '*" & Keyword & "*'"
'検索されている間は続けるループ
Do Until rs.NoMatch = True
'メインフォームのレコードを検索結果に合わせる
Forms!F_名簿.Bookmark = rs.Bookmark
'メッセージボックスでの分岐処理
If MsgBox("見つかりました。まだ検索を続けますか?", vbYesNo, "検索結果") = vbYes Then
'次を検索する場合
rs.FindNext "氏名 like '*" & Keyword & "*'"
Else
Exit Sub
End If
Loop
'見つからなかった場合のメッセージ
MsgBox "該当レコードがありません。"
'DAOのレコードセットを閉じる
rs.Close
db.Close
【閉じるボタンの機能】
- クリック時イベントのプロシージャを作成します。
(プロシージャは省略します)
4.メインフォームに検索用のボタン設置
メインフォームから検索条件設定フォームを開くためのコマンドボタンを設置します。
クリック時イベントのプロシージャを作成します。
(プロシージャ)
Private Sub Btn_検索フォーム_Click()DoCmd.OpenForm "F_検索条件設定"
End Sub
5.使ってみる
機能はこれで完成。フォームビューで表示して操作し結果を確認してください。
その他の調整
付け加えた各コントロールの位置やラベルの調整は行っていません。分かりやすく使いやすい形状に仕上げてください。 テキストボックスのラベル表示は「氏名に含まれる文字を入力」とすると良いでしょう。
(この項終わり)