連載
» 2016年01月20日 05時00分 公開

Access VBAで学ぶ初心者のためのデータベース/SQL超入門(5):AccessでSQLのLIKE演算子を使って「あいまい検索処理」の機能を実装する方法 (3/3)

[薬師寺国安,PROJECT KySS]
前のページへ 1|2|3       

データ検索のコードを記述する

 続いて、データ検索のためのコードを記述していく。

フォームが読み込まれたときの処理

 今回は、前回とは異なり、ボタンをクリックしたときの処理のみならず、フォームが読み込まれたときの処理も必要となる。そこで、フォームが読み込まれたときのイベントプロシージャを記述する。

 図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プロシージャに記述する

 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」を指定すればよい。

photo 図3 「プロシージャの追加」ダイアログボックス

 これを実行すると図4のように表示される。

photo 図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)


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。