このエントリーをはてなブックマークに追加

検索ワードからフォーム上のレコードを探す。(DoCmd.SearchForRecord )

こちらは、Access 2010バージョンで作成した、データ入力をするフォームサンプルと、入力する項目を検索するためのダイアログフォームサンプルです。

ダイアログ

検索フォームにForm.Filterを記述する。のページで、検索フォームに「Form.Filterプロパティ」のコードを書いて、検索ができるようにしています。「Form.Filterプロパティ」では、検索するワードに該当するレコードだけを絞り込んで表示させますが、今回は、検索をしたときに、レコードは絞り込まずに、該当するレコードに移動して表示するようにコードを書いていきます。

下の画像のように、「牛」というワードを入れて、「検索」ボタンを押すと、「牛肉」という「商品名」に移動し、テキストボックスに色を付けて表示し、わかりやすくしています。もう一度、「検索」ボタンを押せば、次に該当するレコードに移動し、該当するレコードが無い場合は、「検索項目は見つかりませんでした。」というメッセージボックスを表示します。

ダイアログフォーム

「商品検索」フォームにVBAコードを次のように記述します。

Option Compare Database
Option Explicit
Dim pKensaku As Integer

Private Sub Form_Load()
Me.kensaku.SetFocus
End Sub

Private Sub kensaku_AfterUpdate()
pKensaku = 1
Me.ボタン1.SetFocus
End Sub

Private Sub ボタン1_Click()
Dim nCheck As String
nCheck = Me.tx_商品ID

Select Case pKensaku
Case 1
DoCmd.SearchForRecord , , acFirst, "商品名 like '*" & Me.kensaku & "*'"
       If InStr(tx_商品名, kensaku) = 0 Then
           MsgBox "検索項目は見つかりませんでした。", vbOKOnly, "商品検索"
           Me.kensaku.SetFocus
        Else
           Me.テキスト0 = Me.tx_商品ID
           pKensaku = 2
           Me.ボタン1.SetFocus
        End If
Case 2
DoCmd.SearchForRecord , , acNext, "商品名 like '*" & Me.kensaku & "*'"
       If Me.tx_商品ID = nCheck Then
          MsgBox "検索項目は見つかりませんでした。", vbOKOnly, "商品検索"
          pKensaku = 1
          Me.kensaku.SetFocus
       Else
	  Me.テキスト0 = Me.tx_商品ID
          Me.ボタン1.SetFocus
      End If
End Select
End Sub

Private Sub Form_Current()
Me.テキスト0 = Me.tx_商品ID
End Sub

では、コードの内容を詳しく見ていきます。

Select Case文で、検索方法を分岐する。

まず、テキストボックスの文字を含むレコードを検索する、DoCmd.SearchForRecordメソッドを使います。

DoCmd.SearchForRecord , , acFirst, "商品名 like '*" & Me.kensaku & "*'"

DoCmd.SearchForRecord オブジェクトタイプ,オブジェクト名,レコード,WhereCondition

DoCmd.SearchForRecordの後は、半角スペースのあと、4つの引数を指定できます。この引数は、すべて省略可能ですが、ここでは、1つ目、2つ目を省略して、3つ目に、「acFirst」を指定しています。これは、検索した結果の最初のレコードを表示します。4つ目の引数には、抽出条件をLike演算子を使って、文字列式で指定しています。

次に、3つ目の引数に「acNext」を指定して、もう一つDoCmd.SearchForRecordメソッドを用意します。

DoCmd.SearchForRecord , , acNext, "商品名 like '*" & Me.kensaku & "*'"

これは、検索した結果の次のレコードを表示するという意味なので、検索結果が2つ目以降の検索をするときに使っていきます。そして、この2つのDoCmd.SearchForRecordメソッドを、「Select Caseステートメント」を使って、条件分岐をします。

Select Case pKensaku
Case 1
DoCmd.SearchForRecord , , acFirst, "商品名 like '*" & Me.kensaku & "*'"
Case 2
DoCmd.SearchForRecord , , acNext, "商品名 like '*" & Me.kensaku & "*'"
End Select

ここで、「Select Case」の後に変数「pKensaku」が登場し、「pKensaku 」の値が、「1」、「2」のときで、条件分岐をしています。まずは、コードエディタの一番最初のところの「Option Explicit」の次(「Option Explicit」の表示がない場合は、「Option Compare Database」の次)に変数の宣言をします。

Option Compare Database
Option Explicit
Dim pKensaku As Integer

「Case1」のときは、検索結果の最初のレコードを表示するので、1回目の検索、「Case2」のときは、次のレコードを表示するので、2回目以降の検索ということになります。検索ワードを入れるテキストボックスに、新たにワードを入れたあとに、検索ボタンを押したときを、最初の検索とみなして、テキストボックスの更新後処理にコードを書きます。テキストボックスの更新後、「検索」ボタンにカーソルを合わせるようにするコードも書いておきます。

Private Sub kensaku_AfterUpdate()
pKensaku = 1
Me.ボタン1.SetFocus
End Sub

そして、最初の検索「Case 1」の処理が終わったあとに、「tx_商品ID」の値を非連結のテキストボックス「テキスト0」代入します。これは、カレントレコードのテキストボックスの背景色を付ける設定をするためです。そして、このあとは、2回目以降の検索に移るので、変数「pKensaku」に「2」を代入します。そのあと、「検索」ボタンにカーソルを合わせるコードも書いておきます。

Me.テキスト0 = Me.tx_商品ID
pKensaku = 2
Me.ボタン1.SetFocus

該当する結果が無い場合にメッセージを表示する。

検索した結果、テキストボックスに入力した文字に該当するレコードが無かったときに、「検索項目は見つかりませんでした。」という、メッセージボックスを表示させるようにします。まずは、新たに検索ワードを入れたときの初回の検索のときです。

InStr(tx_商品名, kensaku) = 0 Then
MsgBox "検索項目は見つかりませんでした。", vbOKOnly, "商品検索"
Me.kensaku.SetFocus

InStr関数を使って、「kensaku」テキストボックスの文字が「tx_商品名」の中にある文字と一致するかを比較します。例えば、「kensaku 」の文字が「牛」で検索した結果、「牛肉」のレコードに移ったとき、1番目の「牛」という文字が一致しているので、このときは、「1」の値を返します。一致する文字が無いときは、「0」を返します。なので、このときに、メッセージボックスを表示させます。

では、最初の検索をしたときに、該当する結果が無かったときと、あったときとで、「If Thenステートメント」を使って、分岐します。

DoCmd.SearchForRecord , , acFirst, "商品名 like '*" & Me.kensaku & "*'"
If InStr(tx_商品名, kensaku) = 0 Then
  MsgBox "検索項目は見つかりませんでした。", vbOKOnly, "商品検索"
  Me.kensaku.SetFocus
Else
  Me.テキスト0 = Me.tx_商品ID
  pKensaku = 2
  Me.ボタン1.SetFocus
End If

次は、2回目以降の検索結果のときです。まず、「nCheck」という変数の宣言をします。そして、「tx_商品ID」の値を「nCheck」に代入します。これを、「検索」ボタンクリック時イベントの冒頭に記述します。

Private Sub ボタン1_Click()
Dim nCheck As String
nCheck = Me.tx_商品ID

そして、DoCmd.SearchForRecordで、検索をしますが、該当するレコードが無かったときは、レコードは移動せずに同じレコードにとどまります。ですので、「tx_商品ID」と「nCheck」の値は同じままとなります。これを利用して、「nCheck = Me.tx_商品ID」のときに、メッセージを表示します。そして、次の検索は無くなりますので、「pKensaku 」に「1」を代入します。「kensaku」テキストボックスにカーソルを合わせます。

該当するレコードがあったときは、レコードが移動するので、「tx_商品ID」と「nCheck」の値は一致しなくなります。ですので、メッセージも表示されません。そして、もう一度検索できるよう、「検索」ボタンにカーソルをあわせておきます。

DoCmd.SearchForRecord , , acNext, "商品名 like '*" & Me.kensaku & "*'"
If  Me.tx_商品ID = nCheck Then
    MsgBox "検索項目は見つかりませんでした。", vbOKOnly, "商品検索"
    pKensaku = 1
    Me.kensaku.SetFocus
Else
    Me.テキスト0 = Me.tx_商品ID
    Me.ボタン1.SetFocus
End If

カレントレコードのテキストボックスに色を付けて表示させるのは、フォームのカレントレコードに背景色を付けてわかりやすくする。のページを参考にしてください。

では、最後に検索フォームを開いたときに、「kensaku」テキストボックスにカーソルがいくようにコードを書いておきます。

Private Sub Form_Load()
Me.kensaku.SetFocus
End Sub
このエントリーをはてなブックマークに追加

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

コメントフィード

トラックバックURL : http://gyoumuka.work/wp-trackback.php?p=2206

PAGE TOPへ戻る