Microsoft Access 掲示板

複数条件の抽出フォームの設計

20 コメント
views
4 フォロー

複数条件の抽出フォームの設計その1を参考に検索フォームを作りました。

氏名検索のところで、漢字でもフリガナ入力でも検索できるようにと思い、フィールドを Orで繋げました。
氏名検索は漢字入力でもフリガナ入力でも検索できるようになったのですが、その他の検索項目を選択すると、動作したり、しなかったりします。
どの部分に不具合が出ているのか、教えて頂きたくよろしくお願いいたします。

フィールド名データ型抽出仕様
氏名テキスト型部分一致
フリガナテキスト型部分一致
参加有無Yes/No型Yes/No
性別 等々テキスト型部分一致
就職年月日日付/時刻型2つのテキストボックスで範囲指定
Private Sub 抽出_Click()
    Dim strfilter As String, strexp As String, aryope As Variant
    
If Not IsNull(Me.氏名検索) Then
strfilter = strfilter & " AND 氏名 Like ""*" & Me.氏名検索 & "*"" Orフリガナ Like ""*" & Me.氏名検索 & "*"""
End If

If Me.参加 = True Then
strfilter = strfilter & " AND 参加有無 =" & Me.参加
End If
    
If Not IsNull(Me.性別検索) Then
strfilter = strfilter & " AND 性別 Like '*" & Me.性別検索 & "*'"
End If

********************************
途中に同じ設定で検索項目を6つ設定しています
********************************

If Not IsNull(Me.産業検索) Then
strfilter = strfilter & " AND 産業分類 Like '*" & Me.産業検索 & "*'"
End If
    
If Not IsNull(Me.職業検索) Then
strfilter = strfilter & " AND 職業分類 Like '*" & Me.職業検索 & "*'"
End If
                
If Not IsNull(Me.min就職日) Then
If Me.min就職日 > Format(Date, "yy/mm") Then
strfilter = strfilter & " AND 就職年月日 >= #" & "19" & Nz(Me.min就職日) & "#"
  Else
    strfilter = strfilter & " AND  就職年月日>= #" & "20" & Nz(Me.min就職日) & "#"
End If
    End If

If Not IsNull(Me.max就職日) Then
If Me.max就職日 > Format(Date, "yy/mm") Then
strfilter = strfilter & " AND 就職年月日 < #" & DateAdd("m", 1, "19" & Me.max就職日) & "#"
Else
strfilter = strfilter & " AND 就職年月日 < #" & DateAdd("m", 1, "20" & Me.max就職日) & "#"
End If
    End If
               
    Me.Filter = Mid(strfilter, 6)
    If strfilter = "" Then
    Me.FilterOn = False
    Else
    Me.FilterOn = True
    End If

End Sub
ただいま勉強中
作成: 2019/07/30 (火) 10:02:26
最終更新: 2019/07/30 (火) 14:14:30
通報 ...
1
hiroton 2019/07/30 (火) 11:00:15 修正 0fa98@f966d

ちょっと眺めただけですが
strfilter = strfilter & " AND 参加有無 Like '*" & Me.参加 & "*'"
参加有無がYes/No型ならばLikeで比較するべきではありませんし、右辺が文字列型になっているので抽出できることはまずないでしょう。(これを見た時点でほかの条件生成文は見ていません)

strfilterMe.FilterOn = Trueの直前でウォッチウィンドウで確認するとかDebug.printでイミディエイトウィンドウで確認してみるとおかしなところがわかると思います。

2
ただいま勉強中 2019/07/30 (火) 12:46:06 4f2cf@96e2f

お返事ありがとうございます。
すみません、確認すると実際には
strfilter = strfilter & " AND 参加有無 =" & Me.参加
と、記述していました。

3

質問は後からでも編集できるので、質問のコードを実際のものに修正してください。

4

あと、確認ですか、Me.参加 はチェックボックスでしょうか。

チェックボックスとして、チェックが入っているときは、「参加有無」フィールドがTrueを抽出するのだと思いますか、チェックが入ってないときはどうしたいのでしょうか。

5
ただいま勉強中 2019/07/30 (火) 14:24:26 4f2cf@96e2f

お返事ありがとうございます。
質問は編集できたのですね。申し訳ありません。
Me.参加 はチェックボックスです。
データ登録画面で、参加する しない を チェックボックスで選択してもらい、
検索画面で、チェックが入ったデータのみを抽出しようと思いましたので、
チェックが入っていないものは抽出しない、程度にしか考えていませんでした。

6
hiroton 2019/07/30 (火) 15:09:51 0fa98@f966d

その他の検索項目を選択すると、動作したり、しなかったり

具体的に上げてください。
何をどうしたらこうなってほしい」のだけれど「何をどうしたらどうなった」というのがなければ書いたとおりに動いているだろうとしか言えません。
エラーが出てコードが途中で止まるという話ではないですよね?

7
ただいま勉強中 2019/07/30 (火) 15:47:01 4f2cf@96e2f

申し訳ありません。
Me.氏名検索 のところで、フリガナ を入力して性別検索であったり 産業検索等の項目をいくつか選択し
抽出をかけると、絞り込みが出来るのですが、
Me.氏名検索 に 漢字で氏名 を入力して同じように項目をいくつか選択し
抽出をかけると、漢字(氏名)のみの絞り込みしか出来ず、その他のいくつか選択した項目の絞り込みが出来ません。

8
hiroton 2019/07/30 (火) 16:12:59 修正 0fa98@f966d

氏名検索のところを

strfilter = strfilter & " AND 氏名 Like ""*" & Me.氏名検索 & "*"" Orフリガナ Like ""*" & Me.氏名検索 & "*"""

strfilter = strfilter & " AND (氏名 Like ""*" & Me.氏名検索 & "*"" Orフリガナ Like ""*" & Me.氏名検索 & "*"")"

でどうでしょう?

9
ただいま勉強中 2019/07/30 (火) 16:37:14 4f2cf@96e2f

ありがとうございます。
早速試しに アオキ で検索しようとした所、

実行時エラー‘3075
クエリ式’(氏名 Like “アオキ” Orフリガナ Like”アオキ”)’の構文エラー:演算子がありません。
と、表示され、下記部分が 黄色に反転しています。

Me.Filter = Mid(strfilter, 6)

申し訳ありません、ほぼ見よう見まねですので、どうしよう・・・という感じになっています。

10
strfilter = strfilter & " AND (氏名 Like ""*" & Me.氏名検索 & "*"" Or フリガナ Like ""*" & Me.氏名検索 & "*"")"

Orフリガナ の間に半角空白が必要です。

11
hiroton 2019/07/30 (火) 17:00:44 0fa98@f966d

提示されている式をそのままコピーして使っているだけなんですが不思議ですね。
(ちなみに自分のところでは元のコードからエラーになります)

12
ただいま勉強中 2019/07/31 (水) 08:06:19 4f2cf@96e2f

hatena様 hiroton様

本日、試したところ無事思うように動きました。
大変勉強になりました。
ありがとうございました。😊

13
hiroton 2019/07/31 (水) 13:26:48 1a36d@f966d

無事に行ったようでなによりです。
せっかくなので軽く解説を置いておきます。

演算子には優先順位があります。
3 + 3 * 3 = 12 '・・・18ではない(乗算が優先される)
といったようなものです。

ACCESS(SQL)のANDORにも優先順位がありANDが優先されます。
例えば元コードで男性の伊藤さんを探そうとなった場合、漢字指定だと
氏名='伊藤' OR フリガナ='伊藤' AND 性別='*男*'

氏名='伊藤' OR (フリガナ='伊藤' AND 性別='*男*')
と同じとなります。その他の検索項目はフリガナで抽出できた場合にしか影響しないということですね。
提示した修正はこれを
(氏名='伊藤' OR フリガナ='伊藤') AND 性別='*男*'
となるようにするものです。

14
ただいま勉強中 2019/08/01 (木) 07:35:44 4f2cf@96e2f >> 13

くわしく解説いただきまして、ありがとうございます。
意味も理解できずに使用していまして、全くダメですね。
この掲示板をもっと活用させて頂いて、勉強していきます。

ありがとうございました。😄

15
ただいま勉強中 2019/08/26 (月) 11:22:25 4f2cf@96e2f

 いつも大変お世話になっております。
漢字フリガナ検索も無事思うように動作するようになり、大変助かっております。

追加の質問をさせて頂きたく、送信いたしました。
検索結果データがない場合、
メッセージボックスで「検索データはありません」等の表示をさせる方法はないでしょうか?
どうぞよろしくお願いいたします。

16
    Me.Filter = Mid(strfilter, 6)
    If strfilter = "" Then
        Me.FilterOn = False
    Else
        Me.FilterOn = True
        If Me.Recordset.RecordCount = 0 Then MsgBox "検索データはありません"
    End If
17
ただいま勉強中 2019/08/27 (火) 12:05:17 4f2cf@96e2f

早々にご返事いただきまして
ありがとうございます。
少しづつ思うような検索フォームに近づいていて
益々勉強しなければ!と思うこの頃です。

本当にありがとうございます。

18
ただいま勉強中 2019/09/20 (金) 13:47:12 10d1a@96e2f

 勉強中と言うばかりで、頼ってばかりで申し訳ありません。
メッセージも表示でき、何とかかたちになった来ました。
厚かましくも、度々の追加質問をさせて頂きたく、再度送信いたしました。

検索項目の追加を考え、月検索(数値型)をリストボックスで作って、複数選択を可能にしたいと、【複数選択リストボックスで選択したレコードの印刷】をもとに色々試したのですが、リストボックスの複数選択で絞り込みが出来ません。
リストボックスでの複数選択した項目を 複数条件の抽出フォームで使用することは出来ないのでしょうか。

If Not IsNull(Me.月検索) Then 
strfilter = strfilter & " AND 月=" & Me.月検索
End If

これをリストボックスの複数選択にしたいと思っているのですが・・・・・。
よろしくお願いいたします。

19

当初の質問とは内容が異なってきていますので、
新規に質問を立ててください。

20
ただいま勉強中 2019/09/21 (土) 09:25:02 c7040@a724a >> 19

申し訳ありません。
新規で質問をさせて頂きます。