#626 サブフォーム内の全フィールドを検索するには? フォーム、VBA

1つのキーワードを指定して、サブフォームに表示されているすべてレコードおよびすべてのフィールドについて、その文字が含まれているかどうかを調べるプログラムの例です。

まずここでは、次のようなデザインのフォームを作ります。

  • 検索対象となるキーワードは、テキストボックス「検索キーワード」に入力します。
  • サブフォームは「frm商品マスタ_sub」という名前とします。

上記のテキストボックス「検索キーワード」への入力値が更新されるとイベントが発生しますので、その「BeforeUpdate/更新後処理」イベントプロシージャで検索処理を実行します。

そのプログラムは次のようなものです。

Private Sub 検索キーワード_AfterUpdate()
'検索キーワードテキストボックスの更新後処理

  Dim rst As Recordset
  Dim sfrm As SubForm
  Dim iintLoop As Integer

  'キーワードが空なら検索しない
  If IsNull(Me!検索キーワード) Then
    Beep
    Exit Sub
  End If

  'サブフォームのオブジェクトを変数にセット
  Set sfrm = Me!frm商品マスタ_sub

  'サブフォームのレコードセットクローンを取得
  Set rst = sfrm.Form.RecordsetClone
  With rst
    'いったん先頭レコードに戻す
    .MoveFirst
    '全レコードの探索ループ
    Do Until .EOF
      'カレントレコードの全フィールドの探索ループ
      For iintLoop = 0 To .Fields.Count - 1
        'フィールド値をすべて文字列として照合
        If InStr(CStr(Nz(.Fields(iintLoop))), Trim$(Me!検索キーワード)) > 0 Then
          '見つかったとき
          'フォームのカレントレコードをクロンのカレントレコードに移動
          sfrm.Form.Recordset.AbsolutePosition = rst.AbsolutePosition
          'そのフィールドにフォーカス移動
          sfrm(.Fields(iintLoop).Name).SetFocus
          .Close
          'プロシージャを抜ける
          Exit Sub
        End If
      Next iintLoop
      .MoveNext
    Loop
    .Close

    '見つからなかったとき
    Beep
    MsgBox "指定したキーワードは見つかりませんでした!", vbOKOnly + vbInformation

  End With

End Sub

  1. プログラムは二重のループになっています。外側のループでは、サブフォームのレコードセットのクローンの先頭から最後まで全レコードをループで移動します。
  2. 内側のループでは、1つのレコードについてすべてのフィールドをループで移動します。
  3. そして現在のレコード・フィールドの値の中に該当するものが見つかったら(フィールドの値にそのキーワードの文字列を含んでいたら)、そのレコードの当該フィールドにフォーカスを移動して検索処理を終了します。
  4. 見つからなかった場合にはメッセージを表示します。


実行例:





※サブフォームのレコードの検索では「RecordsetClone」ではなく「Recordset」も使えますが、その場合にはカーソルが移動していく様子が見えてしまうので、ここではRecordsetClone上を検索して見つかったらRecordsetもそのレコードに移動するという方法をとっています。
| Index | Prev | Next |



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved