こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

アクセス検索用フォームでの完全一致検索

いつも大変お世話になっております。ACCESS初心者ですが,宜しくお願いします。

テーブルAを元にクエリAを作成し,クエリAをレコードソースとしてフォームAを作成しています。フォームAのレコードを検索するのに検索用フォームBを作成しました。検索用フォームBは,フォームAと全く同じデザインで,レコードソースのみ空にしてあります。項目は,氏名,住所,金額,契約締結日,業種分類等20個ほどあり,それぞれ検索するために20個分の非連結のテキストボックスを配置しています。また,検索条件を表示させるためのコマンドボタンを一つ配置しています。コマンドボタンには,以下のVBAを記述しています。

Private Sub 検索実行_Click()
On Error GoTo エラー処理

Dim StrWhr As String 'Where条件式
Dim StrMsg As String '表示メッセージ
Dim StrSrc As String 'レコードソース
Dim stDocName As String '表示用フォームの名前


If Nz(Me!氏名, "") <> "" Then
StrWhr = IIf(StrWhr = "", "", StrWhr & " And ") & "氏名 Like '*" & Me!氏名 & "*'"
End If
If Nz(Me!住所, "") <> "" Then
StrWhr = IIf(StrWhr = "", "", StrWhr & " And ") & "所在地 Like '*" & Me!所在地 & "*'"
End If
   If Nz(Me!金額, "") <> "" Then
StrWhr = IIf(StrWhr = "", "", StrWhr & " And ") & "金額 = " & Me!金額
  End If
If Nz(Me!契約締結日, "") <> "" Then
StrWhr = IIf(StrWhr = "", "", StrWhr & " And ") & "契約締結日 Like '*" & Me!契約締結日 & "*'"
End If
If Nz(Me!業種分類, "") <> "" Then
StrWhr = IIf(StrWhr = "", "", StrWhr & " And ") & "業種分類 = " & Me!業種分類

End If
If StrWhr = "" Then
StrSrc = "Select * From [qry_○○] Order By ○○;"
Else
StrSrc = "Select * From [qry_○○] Where " & StrWhr & " Order By ○○;"
End If

If MsgBox(StrMsg, vbOKCancel, "確認") = vbOK Then

DoCmd.OpenForm "frm_○○", , , StrWhr

Forms("frm_○○").RecordSource = StrSrc
End If

終了処理:
Exit Sub
エラー処理:
MsgBox Err & Error$, , Me.Name & " 検索実行"
Resume 終了処理
End Sub

このうち,氏名,住所,金額に関しては,問題なく検索できますが,契約締結日及び業種分類について検索することができません。

(1)契約締結日に関しては,契約締結日その日のみではなく,指定した契約締結日以前のレコード全てや,期間を指定してレコードを抽出したいのですが,可能でしょうか。
例えば,契約締結日のテキストボックスに
>2008.8.1と入力した場合に,2008.8.1以前に契約を締結した全部のレコードを抽出したり,
2008と入力した場合に,2008(年)に契約締結した全レコードを抽出できることが希望です。

(2)業種分類については,コンボボックスからデータを選択して検索するようになっていますが,検索実行をクリックすると,パラメーターの入力画面が表示され,適当な値を入力しても正しい抽出結果が表示されません。
おそらく,以前に教えていただいた
StrWhr = IIf(StrWhr = "", "", StrWhr & " And ") & "○○ = " & Me!○○
の構文が数値型の完全一致検索の構文のためだと思われます。テキスト型の完全一致検索の構文を教えて下さい。

拙い質問で恐縮ですが,補足等いたしますので,宜しくお願いいたします。

投稿日時 - 2008-08-12 11:24:41

QNo.4245841

困ってます

質問者が選んだベストアンサー

> 「業種分類」でも「種別」でもなく,「業種選択」という
> コントロール名だったので,

これは、まぁ、置いといて・・・

>StrWhr = IIf(StrWhr = "", "", StrWhr & " And ") _
>& "業種分類 = '" & Me!業種分類 & "'"

問題は・・・「"業種分類 = '"」のところ、こちらは、コントロール名ではなく

> DoCmd.OpenForm "frm_○○", , , StrWhr

に使われるレコードソースのフィールド名ですので・・・今のところ、触れてるのは、数が少ないのよ
おそらく、フィールド名が一致しないので、パラメータとして、聞いてきてるんだと思うのですが、比較して無いので、全くパラメータを入力しても、反映して無いと言うことです

投稿日時 - 2008-08-12 16:57:35

お礼

ご連絡が遅くなり,すみません。休み明けの頭は,少しはすっきりしたようで,質問の件が両方とも解決しました。

(1)の方は,文字列にするという前提で,
If Nz(Me!契約締結日, "") <> "" Then
StrWhr = IIf(StrWhr = "", "", StrWhr & " And ") & "Format(契約締結日,'yyyy/mm/dd') Like '*" & Me!契約締結日 & "*'"
End If
としたところ,レコードの抽出が可能となりました。

(2)の方は,
>問題は・・・「"業種分類 = '"」のところ、こちらは、コントロール名ではなく

> DoCmd.OpenForm "frm_○○", , , StrWhr

>に使われるレコードソースのフィールド名ですので・・・今のところ、触れてるのは、数が少ないのよ

のアドバイスにより解決しました。

本当に,色々アドバイスをいただき,ありがとうございました。これからも,アクセスを使用して行く予定ですので,また,よろしくお願いいたします。

投稿日時 - 2008-08-20 14:43:44

ANo.4

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.3

> パラメーターの入力というダイアログが表示されてしまいました。

パラメーターの入力ダイアログのタイトルバーに、何って表示されてました?

#1での補足の通り・・・

> SELECT [tbl_業種別分類マスタ].種別
> FROM tbl_業種別分類マスタ
> GROUP BY [tbl_業種別分類マスタ].種別
> ORDER BY First([tbl_業種別分類マスタ].[NO]);

「業種分類」じゃ、なくて、「種別」と言うフィールドになってるとか?

投稿日時 - 2008-08-12 15:47:53

補足

>パラメーターの入力ダイアログのタイトルバーに、何って表示されてました?

業種選択と表示されました。

>「業種分類」じゃ、なくて、「種別」と言うフィールドになってるとか?

「業種分類」でも「種別」でもなく,「業種選択」というコントロール名だったので,
If Nz(Me!業種選択, "") <> "" Then
StrWhr = IIf(StrWhr = "", "", StrWhr & " And ") & "業種選択 = " & Me!業種選択
に直してみましたが,やっぱりパラメーターの入力を求めるダイアログが出てきてしまいます。表示させる側のレコードに空白があるのがいけないのでしょうか。

明日からお盆休みなので,続きは来週また投稿します

投稿日時 - 2008-08-12 16:06:45

ANo.2

> 逆に,日付時刻型を文字にしてしまうメリット・デメリットは何ですか?
う~ん、例えば、文章が楽!と言うだけ・・・
日付時刻型だと・・・

[契約締結日] Between #2008/07/01# And #2008/07/31#

と、いう形を作ることになりますが・・・
テキスト型に変換した場合

Format([契約締結日],'yyyy/mm/dd') Like '2008*'

で、抽出可能になるという話ね
但し、変な話、前月16日から、翌月15日等、日付を変動させると、条件文が複雑怪奇になってくると言う話ね
ですので・・・

> StrWhr = IIf(StrWhr = "", "", StrWhr & " And ") _
> & #契約締結日# & Me!#契約締結日#

の部分とすれば、

Dim usFrom, usTo as Date

usFrom = Me!契約締結日 ' ここの部分で月単位、年単位など、考慮
usTo = Me!契約締結日 + 30 ' ここの部分で月単位、年単位など、考慮

StrWhr = IIf(StrWhr = "", "", StrWhr & " And ") & "Between #" _
& Format(usFrom,"yyyy/mm/dd") & "# And #" _
& Format(usTo,"yyyy/mm/dd") & "#" )

と、言う話、要は・・・日付をどう操作するかの話
文字列の話なら、上記の通り

StrWhr = IIf(StrWhr = "", "", StrWhr & " And ") _
& "Format(Me!契約締結日,'yyyy/mm/dd') Like '" & Me!契約締結日 & "*'"

と、言うこと・・・日付の方は考慮する必要があるかもね
入力方法、条件方法、抽出範囲などね
(Format関数を介してるのは、mm/dd/yyで、変換されて比較は、yy/mm/ddで比較されるのを避けるため、内部変換は、英語をベースとしてるので、mm/dd/yyと変換することが多いのよ、SQL自体は、Windowsの地域設定に依存するけどね)

2の方は、もっと、簡単な話

> StrWhr = IIf(StrWhr = "", "", StrWhr & " And ") _
> & "業種分類 = " & Me!業種分類

StrWhr = IIf(StrWhr = "", "", StrWhr & " And ") _
& "業種分類 = '" & Me!業種分類 & "'"

と、「'」が抜けてると言う話

投稿日時 - 2008-08-12 13:40:51

補足

(2)の方の完全一致検索の方ですが,
>StrWhr = IIf(StrWhr = "", "", StrWhr & " And ") _
>& "業種分類 = '" & Me!業種分類 & "'"
と入力したら,パラメーターの入力というダイアログが表示されてしまいました。

(1)の方は少し理解が必要なので,よ~~~く読んでから,結果をお知らせしたいと思います。

投稿日時 - 2008-08-12 15:09:28

ANo.1

いろいろ突っ込みどころが、一杯ですが、質問事項だけ・・・

1)の場合
時刻日付型の場合、Like 等は使用できません
ですので、行うとすれば・・・
文字にする(Format関数を使用)と言う話か?
「Between A And B」と範囲抽出を行うか?
のどちらかになります
どちらでも、可能ですので・・・どうするかは、考えましょう
後、日付時刻型の場合、型指定の場合
#2008/08/12#
と「#」で囲むのが正解、「'」「"」は、文字列
自動型変換は、ある程度してくれますが、あまり過信してると・・・希望した結果が出ません

2)のは方は・・・
数値なのでしょうか?
テキスト型の完全一致の場合、先ほど、述べたように、「'」もしくは「"」で、囲むと言う話、数値の場合ならば、記載の通りですが、テキストの場合、「'」または「"」で、囲まれてるようには見えませんが・・・

大体、質問に対しては、以上かな?

投稿日時 - 2008-08-12 11:43:39

補足

ご回答ありがとうございます。突っ込みどころ一杯なんですね…先が思いやられます。

ご質問に関して,補足します。
(1)の件ですが,正直言って,
>文字にする(Format関数を使用)と言う話か?
>Between A And B」と範囲抽出を行うか?
のどちらでも,正しい抽出結果が得られれば構いません。逆に,日付時刻型を文字にしてしまうメリット・デメリットは何ですか?
>後、日付時刻型の場合、型指定の場合
#2008/08/12#
と「#」で囲むのが正解

とのことですが,
StrWhr = IIf(StrWhr = "", "", StrWhr & " And ") & #契約締結日# & Me!#契約締結日#
とすることで良いのでしょうか?

>2)のは方は・・・
数値なのでしょうか?

すみません,説明不足でした。
コンボボックスに表示されるのは,テキストです。
コンボボックスの値集合ソースは
SELECT [tbl_業種別分類マスタ].種別 FROM tbl_業種別分類マスタ GROUP BY [tbl_業種別分類マスタ].種別 ORDER BY First([tbl_業種別分類マスタ].[NO]);
値集合タイプはテーブル/クエリです。

以上,ご質問への回答となっていますでしょうか。宜しくお願いします。

投稿日時 - 2008-08-12 11:56:29

あなたにオススメの質問