- ベストアンサー
アクセスのVBAについて
win2000、アクセス2000を使用しています。 「検索条件」というフォームのテキストに条件を入力したら、「検索結果」というフォームへ抽出されるようにしたいのです。 条件を入力する際に一部分(キーワード)の入力でも当てはまるデータが抽出されるようにしたいのですが、検索条件を入力するテキストボックスが10ヶ所あり、それぞれにキーワードでの抽出をしたいのです。 DoCmd.OpenForm "検索結果", acNormal, , "[施工年度] Like '*" & t_04.Value & "*'" ※[施工年度] →フィールド名 t_04 →テキスト名 上の状態では、うまくいきましたが、条件が複数ある時はどうやって続けたらよいかわかりません。 単純に And で続けたらエラーがでてうまくいきません。 アクセス初心者のため、うまく説明できず申し訳ありませんが、どうぞよろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
No.2 で気が付いたことですが・・・ これですとコードのエラーになると思います。 ↓ Not の次に「舗装 工事名」というスペースの入った部分でエラー。 そして「舗装 工事名」と t_05 は、同じ名前なはずですね。 if が、小文字のままの所を見ると検証していないですね。 if Not .text ="" then stlinkcriteria = stlinkcriteria & "([舗装 工事名] Like '*" & t_05.Value & "*') AND " 余分な横レス ごめんなさいね。 次のようなコードになると思います。 Private Sub btn_検索02_Click() Dim kensaku As String If Not Me![t_04] = "" Then kensaku = kensaku & _ "([舗装 施行年度] Like '*" & Me![t_04] & "*') AND " If Not Me![t_05] = "" Then kensaku = kensaku & _ "([舗装 工事名] Like '*" & Me![t_05] & "*') AND " If Not Me![t_06] = "" Then kensaku = kensaku & _ "([舗装 区間01] Like '*" & Me![t_06] & "*') AND " If Not Me![t_07] = "" Then kensaku = kensaku & _ "([舗装 区間02] Like '*" & Me![t_07] & "*') AND " If Not Me![t_08] = "" Then kensaku = kensaku & _ "([改良 施行年度] Like '*" & Me![t_08] & "*') AND " If Not Me![t_09] = "" Then kensaku = kensaku & _ "([改良 工事名] Like '*" & Me![t_09] & "*') AND " If Not Me![t_10] = "" Then kensaku = kensaku & _ "([改良 区間01] Like '*" & Me![t_10] & "*') AND " If Not Me![t_11] = "" Then kensaku = kensaku & _ "([改良 区間02] Like '*" & Me![t_11] & "*') AND " If Not Me![t_12] = "" Then kensaku = kensaku & _ "([台帳 作図年度] Like '*" & Me![t_12] & "*') AND " If Not Me![t_13] = "" Then kensaku = kensaku & _ "([台帳 調査名] Like '*" & Me![t_13] & "*') AND " If kensaku <> "" Then kensaku = Left(kensaku, Len(kensaku) - 5) DoCmd.OpenForm "検索結果", , , kensaku End If End Sub
その他の回答 (5)
- ja7awu
- ベストアンサー率62% (292/464)
> さっそく試してみましたが、検索条件を1つだけ入力して検索を実行するとうまくいくんですが、3つ4つと条件が複数になるとデータが抽出されませんでした。 > 書き込みしていただいたコードをコピペしたので打ち間違いではないと思うのですが… 間違いなく動作します。確認しています。 > 条件が複数ある時はどうやって続けたらよいかわかりません。 > 単純に And で続けたらエラーがでてうまくいきません And条件 ↑ ですよね。 ※ 「And条件」ということは、条件の入力数が多くなるほど、データは、少なくなることに なります。つまり、だんだん絞り込んでいくんですよ。 この辺、間違いありませんか? Or条件ですと入力する程、抽出数は多くなりますが・・・
- PAPA0427
- ベストアンサー率22% (559/2488)
#1および#2です。 確かに、検証してません。自宅に環境ないものですから…(^^; #3のja7awuさん、フォローアップありがとうございました。 やっぱり、頭の中だけじゃボロでますねぇ。ごめんなさい。
- ja7awu
- ベストアンサー率62% (292/464)
No.3の先頭部分の表現が、適切でなかったようです。 あと、コードの一部が抜けました。 ごめんなさい。 No.2の > if Not 舗装 工事名.text.text ="" then stlinkcriteria = stlinkcriteria & "([舗装 工事名] Like '*" & t_05.Value & "*') AND " if Not 舗装 工事名.text という部分でコントロール名にスペースが 入っていますので、このままでは、コードエラーになると思います。 「舗装 工事名」と「t_05」は同じ名前になるのでは?
お礼
ありがとうございます。 さっそく試してみましたが、検索条件を1つだけ入力して検索を実行するとうまくいくんですが、3つ4つと条件が複数になるとデータが抽出されませんでした。 書き込みしていただいたコードをコピペしたので打ち間違いではないと思うのですが… もう一度確認してみます。
- PAPA0427
- ベストアンサー率22% (559/2488)
ここですね。(引用符ははずしています) stlinkcriteria = "([舗装 施行年度] Like '*" & t_04.Value & "*')" stlinkcriteria = "([舗装 工事名] Like '*" & t_05.Value & "*')" stlinkcriteria = "([舗装 区間01] Like '*" & t_06.Value & "*')" stlinkcriteria = "([舗装 区間02] Like '*" & t_07.Value & "*')" stlinkcriteria = "([改良 施行年度] Like '*" & t_08.Value & "*')" stlinkcriteria = "([改良 工事名] Like '*" & t_09.Value & "*')" stlinkcriteria = "([改良 区間01] Like '*" & t_10.Value & "*')" stlinkcriteria = "([改良 区間02] Like '*" & t_11.Value & "*')" stlinkcriteria = "([台帳 作図年度] Like '*" & t_12.Value & "*')" stlinkcriteria = "([台帳 調査名] Like '*" & t_13.Value & "*')" このコーディングを、 stlinkcriteria = "([舗装 施行年度] Like '*" & t_04.Value & "*') AND " if Not 舗装 工事名.text ="" then stlinkcriteria = stlinkcriteria & "([舗装 工事名] Like '*" & t_05.Value & "*') AND " if Not 舗装 区間.text = "" then stlinkcriteria = stlinkcriteria & "([舗装 区間01] Like '*" & t_06.Value & "*') AND " if Not 舗装 区間02.text = "" then stlinkcriteria = stlinkcriteria & "([舗装 区間02] Like '*" & t_07.Value & "*') AND " if Not 改良 施行年度.text = "" then stlinkcriteria = stlinkcriteria & "([改良 施行年度] Like '*" & t_08.Value & "*') AND " if Not 改良 工事名.text = "" then stlinkcriteria = stlinkcriteria & "([改良 工事名] Like '*" & t_09.Value & "*') AND " if Not 改良 区間.text = "" then stlinkcriteria = stlinkcriteria & "([改良 区間01] Like '*" & t_10.Value & "*') AND " if Not 改良 区間.text = "" then stlinkcriteria = stlinkcriteria & "([改良 区間02] Like '*" & t_11.Value & "*') AND " if Not 台帳 作図年度.text = "" then stlinkcriteria = stlinkcriteria & "([台帳 作図年度] Like '*" & t_12.Value & "*') AND " if Not 台帳 調査名.text = "" then stlinkcriteria = stlinkcriteria & "([台帳 調査名] Like '*" & t_13.Value & "*') AND " L = len(stlinkcriteria) stlinkcriteria = mid(stlinkcriteria , L - 4, L) とすれば、stlinkcriteriaの内容は正常なWHERE句の文字列が生成されるはずです。 なお、if文で使用している、「×××.text」はフォームに配置されているテキストボックスのオブジェクト名とします。
お礼
たびたびありがとうございました。
- PAPA0427
- ベストアンサー率22% (559/2488)
つまり無条件にやっているのが引っかかる元です。 つまり、条件が入力されているかどうかのチェックを入れれば問題解決でしょ? 「検索」ボタンなんかを作ってあげて、そのボタンが押された時に検索に行くように作るのはもちろんですが、検索に行く前に、入力されているか、入力されていなければ、その条件を尾明日する用のコーディングすればいいんですよ。 あなたのお作りなったプログラムの一部でもあればもっと具体的にお答えできるかとは思いますが。
補足
お返事ありがとうございます。 私が作ったのは、下のとおりです。 Private Sub btn_検索02_Click() On Error GoTo err_btn_検索02_click DoCmd.OpenForm "検索結果", acNormal, , "[舗装 施行年度] Like '*" & t_04.Value & "*'" DoCmd.Close acForm, Me.Name exit_btn_検索02_click: Exit Sub err_btn_検索02_click: MsgBox Err.Description Resume exit_btn_検索02_click End Sub もう1つがマニュアル本に載っていたのを流用したんですが、 Private Sub btn_検索02_Click() On Error GoTo err_btn_検索02_click Dim stdocname As String Dim stlinkcriteria As String stlinkcriteria = "([舗装 施行年度] Like '*" & t_04.Value & "*')" stlinkcriteria = "([舗装 工事名] Like '*" & t_05.Value & "*')" stlinkcriteria = "([舗装 区間01] Like '*" & t_06.Value & "*')" stlinkcriteria = "([舗装 区間02] Like '*" & t_07.Value & "*')" stlinkcriteria = "([改良 施行年度] Like '*" & t_08.Value & "*')" stlinkcriteria = "([改良 工事名] Like '*" & t_09.Value & "*')" stlinkcriteria = "([改良 区間01] Like '*" & t_10.Value & "*')" stlinkcriteria = "([改良 区間02] Like '*" & t_11.Value & "*')" stlinkcriteria = "([台帳 作図年度] Like '*" & t_12.Value & "*')" stlinkcriteria = "([台帳 調査名] Like '*" & t_13.Value & "*')" Module1.wherecond = stlinkcriteria stdocname = "検索結果" DoCmd.OpenForm stdocname, , , stlinkcriteria DoCmd.Close acForm, Me.Name exit_btn_検索02_click: Exit Sub err_btn_検索02_click: MsgBox Err.Description Resume exit_btn_検索02_click End Sub 下が標準モジュールに書いたものです。(マニュアル本に書いてあったのでその通りにしました。) Option Compare Database Public wherecond As String Public rptmode As String 実は、検索条件を入力するフォームが2つありまして、1つはマクロで抽出させて(検索01)、もう1つを上のようにVBAで抽出させるよう(検索02)にしました。 検索01と検索02のフォームは、マクロでいったり来たりできるようにしました。 それでですね、最初はマニュアル本の方でうまくいったんですが、テストをしようと検索01のフォームでテストした後に検索02のフォームで抽出しようとすると、抽出できずに全部のデータが表示されてしまうんです。 なので、一番上のVBAを作ってみたのですがそれもうまくいかずで… どうか解決法がありましたら、教えてください。
お礼
大変失礼いたしました。 問題なく抽出できました。 私の勘違いだったようです。 ありがとうございました。