So-net無料ブログ作成
検索選択

VBA DoCmd.FindRecordについて [VBA]

 DoCmd.FindRecordの記事を書こうと思って、サンプルプログラムを作っていたのですが、どうにもうまくいきません。
 私的には、DoCmd.FindRecordの利用は非推奨なので、パスして他の記事を書こうかと思いましたが、いちおういろいろやってみたので、そのことについて書いておこうと思います。

 純粋にDoCmd.FindRecordについて知りたい方、申し訳ありませんが、ここにご希望の内容はありません。ご了承下さい。
 同じような検索であれば、DAOのFindFirstを使うのが良いかと思います。

・構文
 DoCmd.FindRecord  FindWhat , Match , MatchCase , Search , SearchAsFormatted , OnlyCurrentField , FindFirst

・引数
 FindWhat 必須
 検索する数値・文字列を設定します。

 Match
 一致と判断する検索方法を、以下のacEntireクラスから指定します。

名前 説明
acAnywhere 0 FindWhatとフィールドの一部が一致した場合
acEntire 1 FindWhatとフィールド全体が一致した場合
acStart 2 FindWhatがフィールドの先頭から一部一致した場合

 デフォルトはacEntireです。

 MatchCase
 大文字と小文字を区別するかどうかを指定します。
 Trueなら区別します。デフォルトはFalse(区別しない)です。

 Search
 検索を行う方向を指定します。
 以下のAcSearchDirectionクラスから指定します。

名前 説明
acDown 1 カレントレコードより下のすべてのレコードを検索します。
acSearchAll 2 すべてのレコードを検索します。
acUp 3 カレントレコードより上のすべてのレコードを検索します。

 デフォルトはacSearchAllです。

 SearchAsFormatted
 書式化された形式で検索する場合にはTrue、データベースに保存されている形式で検索する場合はFalseを指定します。
 デフォルトはFalseです。

 OnlyCurrentField
 検索対象となるフィールドを指定します。
 以下のAcFindFieldクラスから指定します。

名前 説明
acAll 0 すべてのフィールドで検索します。
acCurrent -1 現在のフィールドだけで検索します。

 デフォルトはacCurrentです。

 FindFirst
 最初のレコードから検索を開始する場合は、Trueを指定します。
 カレントレコードを次のレコードから検索を開始する場合は、Falseを指定します。

 下記のような画面を作成しました。

 「先頭から検索」コマンドボタンには、下記のコードを記述しました。

Private Sub cmdFind_Click()

    DoCmd.FindRecord Me.txtFind, acAnywhere, True, acDown, True, acAll, True
    
End Sub

 また、「次を検索」コマンドボタンには、下記のコードを記述しました。

Private Sub cmdNext_Click()

    DoCmd.FindNext

End Sub

 まず最初に、第5パラメタのSearchAsFormattedは、Falseを指定した場合、エラーになります。
 どのような場合にFalseが指定できるのか分かりませんでした。仕方ないのでTrue固定です。

 「検索」のテキストボックスに検索文字列を入力して、「先頭から検索」コマンドボタンをクリックすると、検索が行われるようにしたかったのですが、コマンドボタンをクリックすると、下図のようになります。

 フォーカスが、「検索」テキストボックスに入力した「山」に移動しました。
 ここでは、「山」を含む「山形県」に移動して欲しかったのですが、レコードではない非連結のテキストボックスをヒットさせてくれました。

 仕方がないので、ひとまずテキストボックスへの入力は止めて、コードに直接書くことにしました。

Private Sub cmdFind_Click()

    DoCmd.FindRecord "山", acAnywhere, True, acDown, True, acAll, True
    
End Sub

 これで、「先頭から検索」をクリックすると、

 「山形県」のフィールドにフォーカスが来ました。
 とりあえず検索成功です。

 その次に「次を検索」で、DoCmd.FindNextを試そうとしたのですが、クリックしても「山形県」からフォーカスが他へ移動しません。

 そこで、第7パラメタをFalseにして、試してみました。
DoCmd.FindRecord "山", acAnywhere, True, acDown, True, acAll, False
 結果、うまくいかなかったのですが、「山形県」のフォーカスが来た後、手動で次のレコードにフォーカスを移動してから、「次を検索」をクリックすると、次の「富山県」に移動しました。
 うーん、思った動作と違います。

 また、第6パラメタの検索対象となるフィールドの指定ですが、acCurrentを指定しても、変化がありませんでした。
DoCmd.FindRecord "山", acAnywhere, True, acDown, True, acCurrent, False
 フォーカスを「都道府県CD」の列に移動してから、ボタンをクリックしても、都道府県名にフォーカスが移動します。
 都道府県CDの列で、検索して欲しいのですが、期待通りの動作をしてくれません。

 DoCmd.FindRecordは、ACCESSのUIにある検索機能を呼び出すものと思われます。

 ですが、パラメタの指定を画面のように変更しても、同じような動作をしてくれません。

 何か私の知らないコツがあるのかも知れませんが、VBAでプログラムを作るのならば、Recordset.FindNextなど代わりに使える物があるので、DoCmd.FindRecordについては、「使えない」という第一印象で放置しようと思います。
 DoCmd.FindRecordを極めても、使う場面がないと思われます…。

 最後に、この検証は、ACCESS2010で行いました。



【2万円から3万円の、格安ホームページ作成サービス】

nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。
※URL(リンク)は記述できません。

トラックバック 0

トラックバックの受付は締め切りました