続いて、データ検索のためのコードを記述していく。
今回は、前回とは異なり、ボタンをクリックしたときの処理のみならず、フォームが読み込まれたときの処理も必要となる。そこで、フォームが読み込まれたときのイベントプロシージャを記述する。
図2の画面から、まずフォーム全体を選択し(薄い青になった部分)、右クリックで「プロパティ」を選ぶ。表示された「プロパティシート」の「選択の種類」から、選択ボックスの「▼」アイコンをクリックして「フォーム」を選択。「イベント」タブから、「読み込み時」に[イベント プロシージャ]を指定する。その後「…」アイコンをクリックすると、「Visual Basic Editor」(以下、VBE)が起動し、下記のイベントプロシージャが生成される。
Option Compare Database
Option Explicit
Private Sub Form_Load()
End Sub
これを、以下のように書き換える。
Option Compare Database Option Explicit Private myRecordset As Recordset Private SQL As String Private Sub Form_Load() SQL = "" End Sub
「Option Explicit」の下にRecordset型の変数「myRecordset」変数と、文字列型の変数「SQL」を宣言し、Form_Load()イベント内で変数「SQL」は「””」(空欄)で初期化する。
次に、「レコードの検索(氏名検索ボタン)」を選び、「プロパティシート」から「イベント」タブを選択する。先頭に「クリック時」という項目があり、その右端にあるドロップダウンの「▼」アイコンをクリックすると表れる、[イベント プロシージャ]を選択する。
その横にある「…」アイコンをクリックすると、VBEが起動する。「氏名検索ボタン_Click」時などの処理はここで記述する。下記のようにしておこう。
Private Sub 氏名検索ボタン_Click() ResultShow (1) End Sub
引数に「1」を渡してResultShowプロシージャを実行する。ResultShowプロシージャについては、後ほど解説する。
次に、「住所検索ボタン」がクリックされたときの処理を記述する。「氏名検索ボタン」と同様に、VBEを起動し、下記のようにしておこう。
Private Sub 住所検索ボタン_Click() ResultShow (2) End Sub
ResultShowプロシージャのコードは以下に示すものだ。先ほどボタンクリック時の処理を書いた後のVBE上に貼り付けよう。
Private Sub ResultShow(flag As Integer) Select Case flag Case 1 SQL = "select * from 顧客管理テーブル where 氏名 LIKE" & "'" & 検索氏名テキストボックス.Value & "*';" Case 2 SQL = "select * from 顧客管理テーブル where 住所 LIKE" & "'" & 検索住所テキストボックス.Value & "*';" End Select Set myRecordset = CurrentDb.OpenRecordset(SQL) 結果リストボックス.RowSourceType = "Table/Query" 結果リストボックス.RowSource = SQL 検索結果個数ラベル.Caption = "検索結果は【" & 結果リストボックス.ListCount - 1 & "】件あります。" myRecordset.Close End Sub
先頭から解説しよう。SQL文のLIKE演算子を用いた検索が「あいまい検索」になる。
まず引数「flag」で条件分岐を行う。引数が「1」であった場合は、「LIKE」演算子を用いて、「検索氏名テキストボックス」に入力された値を含むレコードを抽出する「SQL」文を記述する(3〜4行目)。
引数が「2」であった場合は、LIKE演算子を用いて、「検索住所テキストボックス」に入力された値を含むレコードを抽出するSQL文を記述する(5〜6行目)。
9行目では、現在開いているデータベースをOpenRecordsetメソッドで開き、OpenRecordsetの引数には「SQL文」を指定する。ここでは、引数が「1」または「2」で生成したSQL文を指定することになる。
10行目では、リストボックスの「値集合タイプ」を設定するRowSourceTypeに「Table/Query」と指定。テーブル名、クエリ名、もしくはSQLステートメントを記述できるが、今回は「テーブルとクエリ」を指定している。
11行目のように、RowSourceに「SQL文」を指定することで、「SQL」で検索した結果が「結果リストボックス」内に表示される。
検索結果個数ラベルのCaptionには、「結果リストボックス」のListCountで表示されている個数を取得して表示させる(12行目)。検索結果の件数はこうして得る。「-1」したのは、「列見出し」もカウントされるため。その分を差し引くために「-1」としている。
「ResultShow」プロシージャは直接VBE内にコードを書いたが、それ以外の方法もある。VBEメニューの「挿入」→「プロシージャ」と選択し、表示される「プロシージャの追加」ダイアログボックスへ、名前を「ResultShow」、種類を「Subプロシージャ」、適用範囲を「Privateプロシージャ」と選択して(図3)、「OK」ボタンをクリックする。
すると、
Private Sub ResultShow() End Sub
が生成されるので、引数に「Integer」型の「flag」を指定すればよい。
これを実行すると図4のように表示される。
検索結果が「結果リストボックス」に表示されたあとで、再度全てのデータを「結果リストボックス」に表示したい場合は、「検索氏名テキストボックス」や「検索住所テキストボックス」が未入力の状態で、「レコード検索」ボタンをクリックすると、全てのデータが表示される。
「SQL」文を使用すると、簡単に必要なレコードが取得できることを理解できただろうか。
次回は、再度「SQL」文を使って、登録されているデータの編集処理を解説する。お楽しみに。
薬師寺国安事務所代表。Visual Basicプログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。
1997年に薬師寺聖とコラボレーション・ユニット「PROJECT KySS」を結成。
2003年よりフリーになり、PROJECT KySSの活動に本格的に参加。.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。
Windows Phoneアプリ開発を経て、現在はWindowsストアアプリを多数公開中。
Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)
Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)
Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)
Microsoft MVP for Development Platforms-Windows Platform Development (Oct 2014-Sep 2015)
Copyright © ITmedia, Inc. All Rights Reserved.