顧客管理フォームに、「条件に合致するレコードを検索する機能」を設置するAccess VBAで学ぶ初心者のためのデータベース/SQL超入門(11)(3/4 ページ)

» 2016年10月13日 05時00分 公開
[薬師寺国安PROJECT KySS]

「氏名」と「住所」に合致するレコードを検索する(あいまい検索)

 レコード移動フォームにある「ID」「氏名」「性別」「年齢」「郵便番号」「住所」「電話番号」のラベルと「テキストボックス」を全てコピーし、新規作成したフォームデザイン上にペーストする。ボックス類の配置位置は適宜調整してほしい。

 フォームのプロパティシートにある「レコードソース」にて、右の「v」アイコンをクリックして表示される項目より「顧客管理テーブル」を選択する。この指定を行っていないと、テキストボックス全般でデータが表示されないので忘れないようにしてほしい。

 この他のテキストボックスは、レコード移動フォーム内で「コントロールソース」を指定した設定がそのままコピーされているはずなので、ここでは特に設定する必要はない。フォームデザイン画面上部の「フォーム1」のタブ上でマウスの右クリック→上書き保存する。フォーム名は「レコード検索フォーム」とする。

 続いて、氏名と住所を検索するための「テキストボックスを」2個と、実行用の「ボタン」コントロールを配置する。「ラベル」「テキストボックス」「ボタン」の書式は、これまで設定してきた標準書式で構わない。

 氏名テキストボックスの名前は「検索氏名テキストボックス」に、住所テキストボックスの名前は「検索住所テキストボックス」とする。同じく、ボタンの表題は「実行」とし、ボタンコントロールの名前は「実行ボタン」と指定しておく。

 「レコードの先頭に戻る」ボタンも追加しておこう。もう1つボタンコントロールを配置して、表題を「先頭に戻る」、ボタンコントロールの名前を「先頭ボタン」とする。

配置するコントロール
コントロールの種類 名前
テキストボックス 検索氏名テキストボックス
テキストボックス 検索住所テキストボックス
ボタン 実行ボタン
ボタン 先頭ボタン

 レイアウトの完成形は、図7の通りだ。

photo 図7 氏名と住所から検索するための「テキストボックス」と「ボタン」を配置した

実行ボタンがクリックされた時の処理

 では、「実行ボタン」を押したときのコードを記述していく。

 「実行ボタン」コントロールを選択した状態で、プロパティシート→「イベント」タブをクリックする。「▼」アイコンで[イベントプロシージャ]を選択し、「…」アイコンをクリックするとVBEが開き、

Private Sub 実行ボタン_Click()

End Sub


 のコードが生成される。これをリスト2のコードに書き換える。

Private Sub 実行ボタン_Click()
  If IsNull(検索氏名テキストボックス.Value) = True Then
     MsgBox ("氏名が未入力です。")
     Exit Sub
  End If
  
  If IsNull(検索住所テキストボックス.Value) = True Then
     MsgBox ("住所が未入力です。")
     Exit Sub
  End If
  
  DoCmd.OpenForm FormName:="レコード検索フォーム", DataMode:=acReadOnly
  DoCmd.SearchForRecord ObjectType:=acDataForm, ObjectName:="レコード検索フォーム", Record:=acNext, WhereCondition:="[氏名] LIKE '*" & 検索氏名テキストボックス.Value & "*' AND [住所] LIKE '*" & 検索住所テキストボックス.Value & "*'"
End Sub
リスト2:氏名と住所に合致するレコードを選択する、あいまい検索の処理

 リスト2のコードは、以下のように記述してある。

 「検索氏名テキストボックス」や「検索住所テキストボックス」が未入力の場合は、警告メッセージを表示して処理を抜ける。

 DoCmd.OpenFormで「レコード検索フォーム」を開く。

 DoCmd.SearchForRecordで、WhereConditionにLIKE演算子を使って、検索氏名テキストボックスに入力された値と「検索住所入力テキストボックス」に入力されたデータが含まれるレコードを検索させる。DoCmd.SearchForRecordの基本書式は下記の通りだ。

  • DoCmd.SearchForRecord(ObjectType:=表3の値(省略可),ObjectName:=検索するレコードの含まれるデータベースの名前(省略可),Record:=表4の値(省略可),WhereCondition:=レコードの位置を特定するための文字列(省略可))
表3 ObjectTypeに指定する値
名前 説明
acActiveDataObject レコードはアクティブオブジェクトに含まれる
acDataForm レコードはフォームに含まれる
acDataFunction レコードはユーザー定義関数に含まれる
acDataQuery レコードはクエリに含まれる
acDataReport レコードはレポートに含まれる
acDataServerView レコードはサーバビューに含まれる
acDataStoredProcedure レコードはストアドプロシージャに含まれる
acDataTable レコードはテーブルに含まれる
(出典:Office Dev Center「AcDataObjectType 列挙 (Access)」)

 なお、今回はacDataFormを指定している。

表4 Recordに指定する値
名前 説明
acFirst 先頭のレコードをカレントレコードにする
acGoTo 指定したレコードをカレントレコードにする
acLast 最後のレコードをカレントレコードにする
acNewRec 新しいレコードをカレントレコードにする
acNext 次のレコードをカレントレコードにする
acPrevious 前のレコードをカレントレコードにする
(出典:Office Dev Center「AcRecord 列挙 (Access)」)

 今回は、次のレコードをカレントレコードにするacNextを指定している。よって、条件を満たすレコードが複数ある場合は、「実行」ボタンをクリックするたびに順次該当するレコードが表示される動きとなる。

先頭ボタンがクリックされた時の処理

 「先頭ボタン」を選択した状態で、プロパティシート→「イベント」タブをクリックする。「▼」アイコンで[イベントプロシージャ]を選択し、「…」アイコンをクリックするとVBEが開き、

Private Sub 先頭ボタン_Click()

End Sub


 のコードが生成される。これをリスト3のコードに書き換える。

Private Sub 先頭ボタン_Click()
    DoCmd.GoToRecord , , acFirst
End Sub
リスト3:「先頭ボタン」を押したときの処理

 リスト3は、DoCmd.GoToRecord , , acFirstで先頭のレコードに移動するように記述してある。書式は以下の通りだ。

  • DoCmd.GoToRecord(objectType,objectName,acRecord)

 objectTypeは表3の値を指定する。省略可能だ。objectNameは、objectTypeで選択した種類のオブジェクトの有効な名前を文字列式で指定する。こちらも省略可能だ。

 acRecord表4の値を指定する。今回は、acRecordの値である「acFirst」を指定して先頭のレコードに移動している。

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

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

メールマガジン登録

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