Microsoft Access 掲示板

検索結果のレコード移動がうまくいきません。

20 コメント
views
4 フォロー

初心者です。従業員管理のデータベースファイルを作っています。

フォームヘッダーに検索用ボックス1つと、
コマンドボタンを3つ設置しています。(実行ボタン、前へ、次へ)

検索用ボックスは、社員番号と、姓(漢字、ひらがな)の3つの条件から検索します。
実行ボタンのイベントプロシージャは以下の通りです。
DoCmd.SearchForRecord,,acFirst,"社員番号 Like '*" & Me!検索 & "*'"
DoCmd.SearchForRecord,,acFirst,"姓 Like '*" & Me!検索 & "*'"
DoCmd.SearchForRecord,,acFirst,"せい Like '*" & Me!検索 & "*'"
改善の余地がありそうですが、知識が乏しく、現状これで動作しています…。

質問したい点は、この検索結果に対して、前のレコード、次のレコードへの移動をさせたく、ボタンを設置したはずなのですが、うまくいきません。
イベントプロシージャ
次へ  DoCmd.SearchForRecord,,acNext,"せい Like '*" & Me!検索 & "*'"
    DoCmd.SearchForRecord,,acNext,"姓 Like '*" & Me!検索 & "*'"
前へ  DoCmd.SearchForRecord,,acPrev,"せい Like '*" & Me!検索 & "*'"
    DoCmd.SearchForRecord,,acPrev,"姓 Like '*" & Me!検索 & "*'"
実行ボタンのように、複数条件を設定したいのですが、結果が思うようになりません。
次へのボタンは機能するのに、前へのボタンで戻れない・・・といった具合です。

SearchForRecordで、これらの複数条件を、もっと簡略化できますでしょうか?
また、他に方法があれば教えていただきたいです。

情報が足りなかったら申し訳ありません。よろしくお願いします。

※管理者権限でコードをMarkDown書式に修正しました。

MK
作成: 2019/06/20 (木) 11:39:27
最終更新: 2019/06/21 (金) 12:00:36
通報 ...
1

サンプルを作成して提示のコードで試してみましたが、前へボタンで戻れないという症状は再現できませんでした。
そのレコードより前に該当レコードがあるのに移動しないのでしょうか。
その場合、検索ボックスにはどのようなデータが入力されてますか。

2

自分が書くなら下記のようなコードになります。
社員番号フィールドのデータ型は数値型の前提です。
完全一致の場合は、Like ではなく = の方がいいでしょう。
検索ボックスのテキストが数字だけなら 社員番号、ひらがなだけなら せい、それ以外なら を対象に検索するようにしてます。

Private Sub 検索実行_Click()
    DoSearch acFirst
End Sub

Private Sub 次へ_Click()
    DoSearch acNext
End Sub

Private Sub 前へ_Click()
    DoSearch acPrevious
End Sub

Private Sub DoSearch(Rec As AcRecord)
    If Nz(Me.検索.Value) = "" Then
        MsgBox "検索テキストボックスに入力してください。"
        Exit Sub
    End If
    
    If Not Me.検索.Value Like "*[!0-9]*" Then
        DoCmd.SearchForRecord , , Rec, "社員番号 = " & Me!検索
    ElseIf Not Me.検索.Value Like "*[!あ-ん]*" Then
        DoCmd.SearchForRecord , , Rec, "せい = '" & Me!検索 & "'"
    Else
        DoCmd.SearchForRecord , , Rec, "姓 = '" & Me!検索 & "'"
    End If
End Sub
3

いつもありがとうございます。

現在、クエリで社員番号昇順で表示されます。
質問に記載した条件ですと、
検索ボックスが空白だった場合ですが、
次へを押すことで、社員番号を1つ飛ばしで表示されることがわかりました。
原因はわからないのですが、コードの訂正を試みています。

鈴木の姓が3人いると仮定して、
検索ボックス内が、
すずき でも 鈴木 でも、
前後できるようにしたいのですが、
すずきだとレコードの移動ができるのに、
鈴木だとできない、といった具合です。

4

社員番号フィールドのデータ型はなんでしょうか。テキスト型または数値型どちらですか。

私の回答したコードも試してもらえますか。

5

ありがとうございます。社員番号はテキスト型でした。
ご回答いただいたコードで、社員番号検索が不可能なことを承知の上で試したところ、
せいでは、検索できる人とできない人がいます。条件は不明です。
姓では全て検索できました。また、前へ、次へのボタンも問題なく動作しました。

7

社員番号がテキスト型のとのことですが、数字のみでしょうか。それとも数字以外も含まれてますか。
数字のみなら、下記のように修正すればいいかと思います。

    If Not Me.検索.Value Like "*[!0-9]*" Then
        DoCmd.SearchForRecord , , Rec, "社員番号 = '" & Me!検索 & "'"

せいでは、検索できる人とできない人がいます。条件は不明です。

出来ないときの、検索ボックスの値と、検索したいデータの値の例をいつくか提示してもらえますか。

11

ありがとうございます。
検索ボックスの値も、検索したいデータも、完全一致を想定した「せい」のみです。

と、回答の途中で、謎が解けました!せいのどこかに、濁点が含まれるとヒットしていませんでした。
解決方法がありますでしょうか。

6
名前なし 2019/06/21 (金) 09:33:50 feab0@f966d

行儀悪いのは承知で

次へ
DoCmd.SearchForRecord,,acNext,"社員番号 Like '*" & Me!検索 & "*' or せい Like '*" & Me!検索 & "*' or 姓 Like '*" & Me!検索 & "*'"

前へ
DoCmd.SearchForRecord,,acPrevious,"社員番号 Like '*" & Me!検索 & "*' or せい Like '*" & Me!検索 & "*' or 姓 Like '*" & Me!検索 & "*'"

なんかどうですかね

8

回答ありがとうございます。
質問のコードには、* が付いてないので、完全一致での検索かと思います。

部分一致なら、どうせインデックスは無効になるので、下記でもOKですね。

DoCmd.SearchForRecord,,acNext,"社員番号 & ';' & せい & ';' & 姓  Like '*" & Me!検索 & "*'"

ひょっとすると、質問者さんは部分一致での検索を想定していて、うまくいかないといっているのかも、と思ってきますか。

9

ありがとうございます。
当初部分一致のつもりで、*も入れていたのですが、
「お」で検索すると、頭に「お」が付く人だけでなく、「あさおか」などもヒットしてしまっていたので、
完全一致に変更したつもりでいました。

10
名前なし 2019/06/21 (金) 10:44:19 feab0@f966d >> 8

自分も最初そう思ってたんですけどMarkdownのアレかなーってやつですね。
ソース表示したら・・・

15
名前なし 2019/06/21 (金) 11:54:34 8b8f2@f9cf6 >> 8

あっ、そうか、*はMarkdownの斜体なので見えなくなるんでした。忘れてた('◇')ゞ

12

回答ありがとうございます!!

せいの検索のコードを、
    ElseIf Not Me.検索.Value Like "[!あ-ん]" Then
        DoCmd.SearchForRecord , , Rec, "せい Like '" & Me!検索 & "*'"
にしてみたところ、解決しました。

いつも本当にありがとうございます。また困ったら質問させてくださいm(_ _)m

13

・・・濁点の含まれた検索だけ、解決していませんでした。汗
「いそがい」は、「いそ」で検索すれば出てくる状態ですm(_ _)m

14

連投、申し訳ありません。
新田(にった)など、小さい文字もヒットしません・・・。

17

下記を試してみてください。

DoCmd.SearchForRecord,,acNext,"社員番号 & ';' & せい & ';' & 姓  Like '*" & Me!検索 & "*'"
19

ありがとうございます。上記のコードで、全ての検索が可能になりました。

現状、「たけ」で検索すると、「おおたけ」がヒットするのですが、
前方一致にする方法はありますでしょうか。

20
名前なし 2019/06/21 (金) 16:29:02 feab0@f966d

(社員番号、せい、姓)すべて前方一致でいいのであればLikeの条件を区切り文字+検索文字とすると良いです。

DoCmd.SearchForRecord,,acNext,"';' & 社員番号 & ';' & せい & ';' & 姓  Like '*;" & Me!検索 & "*'"

ざっくり解説すると「Me!検索=たけ」のとき
検索文字だけで検索(Likeの条件は「'*たけ*'」)
(社員番号);おおたけ;大竹 ←一致する
(社員番号);たけだ;武田 ←一致する

区切り文字+検索文字で検索(Likeの条件は「'*;たけ*'」)
;(社員番号);おおたけ;大竹 ←一致しない
;(社員番号);たけだ;武田 ←一致する

このように前方一致を満たせます。
ただし、この形にすると社員番号で検索したいときもLikeの条件には「;」がついてくるので比較元の文字列も区切り文字から始まるようにします。