次の方法で共有

フィルタで抽出したレコードに対する検索が失敗したらトラップする方法

Anonymous
2014-05-26T08:31:16+00:00

コミュニティにはいつもお世話になっています。

今回はフィルタ適用時に検索した時、検索失敗をトラップする方法(VBAコード)が分からず詰まっております。

あるいは「フィルタで抽出したレコードのみを検索する方法」かもしれません。

お知恵を貸していただけませんでしょうか。

■実現したい事

前提:

  • データシートビューまたは分割フォーム形式の任意のフォームを使用しています。
  • フィルタは基本的に複数のレコードを抽出します。(特定レコードを抽出するためのフィルタではない)

実行:

  1. フォームにフィルタを適用する。
  2. 抽出されたレコードの中で特定の記載(ID番号や属性など)があるものを検索する。
  3. 見つからない時は特定のアクションをする(今回は最後のレコードへ移動)

上記3つのアクションをVBAで実行しようとしています。

今回はこの内の2,3のコードが分からずにいます。

■不明点

Me.Recordset.FindFirst等のFindメソッドで検索し、NoMatchプロパティで検索失敗の条件分岐をしようと考えました。

しかしこれだとテーブル全体のレコードを検索してしまうのか、「フィルタで抽出されないレコード」がヒットしてもNoMatchプロパティがFalse(検索成功)になってしまいます。

DoCmd.FindRecord メソッドやDoCmd.SearchForRecord メソッドだと検索の成功失敗による戻り値が無いようなので条件分岐ができないように思います。

【質問】

  1. Findメソッドを使い「フィルタで抽出されたレコードのみ」を検索できるでしょうか。
  2. あるいは他に特定のレコードへの移動と失敗時の条件分岐ができるような方法はあるのでしょうか。

■背景

フィルタ適用後にFindメソッドで検索しフィルタ抽出外のレコードがヒットすると、ヒットレコードをカレントレコードにできず上端のレコードに移動してしまいます。

これが不都合なのでトラップしたいのと、このフロー(フィルタ→検索失敗→アクション)自体が他で使う可能性が高いため勉強したいと考えてます。

初めてBookmarkを使ったりもしましたが、結局、失敗が判定できないと使えず、詰まってしまいました。

宜しくお願いします。

Microsoft 365 と Office | アクセス | 家庭向け | Windows

ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。

0 件のコメント コメントはありません

質問作成者が受け入れた回答

Anonymous
2014-05-26T10:43:51+00:00

実行:

  1. フォームにフィルタを適用する。
  2. 抽出されたレコードの中で特定の記載(ID番号や属性など)があるものを検索する。
  3. 見つからない時は特定のアクションをする(今回は最後のレコードへ移動)

上記3つのアクションをVBAで実行しようとしています。

・・・

しかしこれだとテーブル全体のレコードを検索してしまうのか、「フィルタで抽出されないレコード」がヒットしてもNoMatchプロパティがFalse(検索成功)になってしまいます。

当方でのサンプルでは問題なく  NoMatch で判定できました。

検証用コード

    Me.Filter = "分類=1"

    Me.FilterOn = True

    With Me.Recordset

        .FindFirst "顧客コード=30"

        If .NoMatch Then

            MsgBox "該当レコードはありません。"

            .MoveLast

        End If

    End With

顧客コードは主キーで、顧客コード30のレコードは分類1ではありません。

上記を実行すると、「該当レコードはありません。」とメッセージが出た後、最終レコードへ移動します。

分割フォームのコマンドボタンに割り当てて実行しました。

また、データシードビューで、フォームのダブルクリックに割り当てて実行しました。

どうしてもうまくいかない場合は、実際のコードをここに貼り付けてください。

この回答は役に立ちましたか?

0 件のコメント コメントはありません

1 件の追加の回答

並べ替え方法: 最も役に立つ
  1. Anonymous
    2014-05-28T09:29:10+00:00

    返信ありがとうございます。

    当方でのサンプルでは問題なく  NoMatch で判定できました。

    あれ、確かに今やるとそうですね。できました。

    質問のあと、いくつか小変更しながら試行していて、大枠は変えていないつもりだったのですが、もしかしたらただのコード記載ミスだったかもしれません。

    初歩的なチェックミスであれば大変失礼しました。

     # 先日は一行ずつステップインしながらローカルウィンドウも見ながら結果を確認していたのですが

      なぜ発見出来なかったんだろう。う~ん、本当にただのポカだったかも。

    解決しましたので回答としてマークしました。本当にありがとうございました。

    ■ 結論

    Recordset.FindFirst等のFindメソッドは「フィルタ適用済の場合、抽出したレコードのみを検索」する。

    フィルタで抽出されたレコードセット内でヒットしなければNoMatch = True (検索失敗)になる。

    なお、個人的にhatena19さんのコードがシンプルで参考になりました。

    With Me.Recordset

            .FindFirst "顧客コード = '" & tb顧客コード & "'"

            If .NoMatch Then .MoveLast

    End With

    スッキリ。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません