2011/05/15

access2010 access2007 Docmd.FindRecord/FindNext

hatenaさんとこのフォームのすべてのフィールドを対象とする検索機能を読んで、これをやっておかないとそのうち忘れてしまいそうだからやってみた。

詳細セクションにはテキストボックスのみという仕様で、フォームヘッダに検索用テキストボックスとコマンドボタンを配置。検索テキストボックス更新したら先頭から検索。

Option Compare Database
Option Explicit

Private ctrFirst As Access.Control
Private ctrPrev As Access.Control
Private flgNext As Boolean

Private Sub Form_Load()
    Set ctrFirst = Me.ID
End Sub

'Private Sub 詳細_Paint()
'    If ctrFirst Is Nothing Then
'        Set ctrFirst = Screen.ActiveControl
'    End If
'End Sub

Private Sub cmdSearch_Click()
    If Len(Me.txtFind & "") = 0 Then Exit Sub
    If Screen.PreviousControl.Name <> Me.txtFind.Name Then
        Set ctrPrev = Screen.PreviousControl
    End If
    DoCmd.Echo False
    Me.txtFind.Enabled = False
    If flgNext Then
        ctrPrev.SetFocus
        ctrPrev.SelStart = 255
        DoCmd.FindNext
    Else
        ctrFirst.SetFocus
        DoCmd.FindRecord Me.txtFind, acAnywhere, _
                        False, acSearchAll, , _
                        acAll, True
        flgNext = True
    End If
    Me.txtFind.Enabled = True
    DoCmd.Echo True
    flgNext = Screen.ActiveControl.SelLength <> 0
End Sub

Private Sub txtFind_AfterUpdate()
    flgNext = False
End Sub

Private Sub txtFind_GotFocus()
    If Screen.PreviousControl.Name <> Me.cmdSearch.Name Then
        Set ctrPrev = Screen.PreviousControl
    End If
End Sub
ちょっと画面のちらつきが気になるかな。思ったより面倒な処理なんだなと思った。NavigationButtonsの検索機能が優秀なのだろう。

0 件のコメント: