• ベストアンサー

アクセスのVBAについて

win2000、アクセス2000を使用しています。 「検索条件」というフォームのテキストに条件を入力したら、「検索結果」というフォームへ抽出されるようにしたいのです。 条件を入力する際に一部分(キーワード)の入力でも当てはまるデータが抽出されるようにしたいのですが、検索条件を入力するテキストボックスが10ヶ所あり、それぞれにキーワードでの抽出をしたいのです。 DoCmd.OpenForm "検索結果", acNormal, , "[施工年度] Like '*" & t_04.Value & "*'" ※[施工年度] →フィールド名  t_04    →テキスト名 上の状態では、うまくいきましたが、条件が複数ある時はどうやって続けたらよいかわかりません。 単純に And で続けたらエラーがでてうまくいきません。 アクセス初心者のため、うまく説明できず申し訳ありませんが、どうぞよろしくお願いします。

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

  • ベストアンサー
  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.3

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)
回答No.6

> さっそく試してみましたが、検索条件を1つだけ入力して検索を実行するとうまくいくんですが、3つ4つと条件が複数になるとデータが抽出されませんでした。 > 書き込みしていただいたコードをコピペしたので打ち間違いではないと思うのですが… 間違いなく動作します。確認しています。 > 条件が複数ある時はどうやって続けたらよいかわかりません。 > 単純に And で続けたらエラーがでてうまくいきません And条件 ↑ ですよね。 ※ 「And条件」ということは、条件の入力数が多くなるほど、データは、少なくなることに なります。つまり、だんだん絞り込んでいくんですよ。 この辺、間違いありませんか? Or条件ですと入力する程、抽出数は多くなりますが・・・

n-shan
質問者

お礼

大変失礼いたしました。 問題なく抽出できました。 私の勘違いだったようです。 ありがとうございました。

  • PAPA0427
  • ベストアンサー率22% (559/2488)
回答No.5

#1および#2です。 確かに、検証してません。自宅に環境ないものですから…(^^; #3のja7awuさん、フォローアップありがとうございました。 やっぱり、頭の中だけじゃボロでますねぇ。ごめんなさい。

  • ja7awu
  • ベストアンサー率62% (292/464)
回答No.4

No.3の先頭部分の表現が、適切でなかったようです。 あと、コードの一部が抜けました。 ごめんなさい。 No.2の > if Not 舗装 工事名.text.text ="" then stlinkcriteria = stlinkcriteria & "([舗装 工事名] Like '*" & t_05.Value & "*') AND " if Not 舗装 工事名.text という部分でコントロール名にスペースが 入っていますので、このままでは、コードエラーになると思います。 「舗装 工事名」と「t_05」は同じ名前になるのでは?

n-shan
質問者

お礼

ありがとうございます。 さっそく試してみましたが、検索条件を1つだけ入力して検索を実行するとうまくいくんですが、3つ4つと条件が複数になるとデータが抽出されませんでした。 書き込みしていただいたコードをコピペしたので打ち間違いではないと思うのですが… もう一度確認してみます。

  • PAPA0427
  • ベストアンサー率22% (559/2488)
回答No.2

ここですね。(引用符ははずしています) 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」はフォームに配置されているテキストボックスのオブジェクト名とします。

n-shan
質問者

お礼

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

  • PAPA0427
  • ベストアンサー率22% (559/2488)
回答No.1

つまり無条件にやっているのが引っかかる元です。 つまり、条件が入力されているかどうかのチェックを入れれば問題解決でしょ? 「検索」ボタンなんかを作ってあげて、そのボタンが押された時に検索に行くように作るのはもちろんですが、検索に行く前に、入力されているか、入力されていなければ、その条件を尾明日する用のコーディングすればいいんですよ。 あなたのお作りなったプログラムの一部でもあればもっと具体的にお答えできるかとは思いますが。

n-shan
質問者

補足

お返事ありがとうございます。 私が作ったのは、下のとおりです。 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を作ってみたのですがそれもうまくいかずで… どうか解決法がありましたら、教えてください。

関連するQ&A

  • Accessのクエリ

    初めまして。Accessのクエリについての質問です。 Access2003を使っています。 検索フォームを作り、その検索フォームにテキストボックスを2つ作り、そのテキストボックスに検索したい言葉を入力し、コマンドボタンで作った検索ボタンを押すとマクロでフィルタの実行がされデータを抽出できるというものを作りました。フィルタには選択クエリを使用しています。抽出したい2つのフィールドの抽出条件にあいまい条件のLike "*" & [Forms]![フォーム名]![テキストボックス名] & "*"を入れています。 今はテキストボックスが2つですが、もっと増やしていろんな条件で検索出来るようにしたいので、3つ目のテキストボックスを作り、抽出条件も同じように入れました。ですが、そうすると今までちゃんとできていた最初の2つのテキストボックスによる抽出が違った結果となりでてきました。このとき、新しく作った3つ目のテキストボックスは空欄なので最初と同じ結果が出ると思ったのですが、これは抽出条件が3つはできないということでしょうか?どなたか教えてください。

  • アクセスVBAの検索で。

    アクセスでカレンダーというかスケジュールを管理できるようなものをつくろうとしています。 非連結フォーム1に ・入力年 ・入力月 ・[1]-[45]まで(それぞれ年月が変わると日付がかわる) という感じで入っています。 T_用件というテーブルには ・年(数値型 ・月(数値型 ・日(数値型 ・用件(テキスト型) とあり、これをもとに「F_用件」フォームを作成してあります。 フォーム1のボタンの1つを例にとるとこんな感じです。 If Me![7].Value <> "" Then Year = "(T_用件.年=" & (Me!入力年.Value) & ")" Month = "(T_用件.月=" & (Me!入力月.Value) & ")" Day = "(T_用件.年=" & (Me![7].Value) & ")" WhereCond = WhereCond & " AND (" & Year & " AND " & Month & " AND " & Day & ")" End If WhereCond = Mid(WhereCond, 6) DoCmd.OpenForm "F_用件", acNormal, , WhereCond こうするとF_用件フォームは開くのですが、きちんと検索されてきません。 どこが悪いのでしょうか? よろしくお願いします。

  • アクセスの抽出について

    Win2000、アクセス2000を使用しています。 フォーム上のテキストボックスに検索条件を入力して抽出をさせる場合に、AというフォームとBというフォームにそれぞれ検索条件を入力してAB両方の条件に合致するデータを抽出することは可能でしょうか? 可能でしたら、手順等教えてください。

  • Access クエリについて

    初めまして。Accessのクエリについての質問です。 Access2003です。 検索フォームを作り、その検索フォームにテキストボックスを2つ作り、そのテキストボックスに検索したい言葉を入力し、コマンドボタンで作った検索ボタンを押すとマクロでフィルタの実行がされデータを抽出できるというものを作りました。フィルタには選択クエリを使用しています。抽出したい2つのフィールドの抽出条件に[forms]![フォーム名]![テキストボックス名]を入れています。 今は2つのテキストボックス両方に言葉を入力するとデータが抽出されますが、これを1つのテキストボックスだけ入力でもデータが抽出されるようにしたいのですが可能ですか?今は一つのテキストボックスに言葉を入力しもう一つを空欄にすると何もデータが出てこない状態です。 2つのテキストボックスをテキスト(1)とテキスト(2)とすると 以下のようにデータを抽出したいです。 ・テキスト(1)とテキスト(2)に入力 →両方の言葉が一致したデータ ・テキスト(1)だけに入力  →テキスト(1)の言葉だけ一致したデータ ・テキスト(2)だけに入力  →テキスト(2)の言葉だけ一致したデータ 初歩的な質問でしたら申し訳ないです。どうかお願いします。

  • アクセスのテキストボックスでOR条件の設定をしたい

    抽出用のフォームを作成し、非連結でテキストボックスを設定し、[抽出]ボタンを押すと別のフォームに抽出出来る様にしています。これを、空白区切りで複数のキーワードを入力するとOR条件で抽出出来る様にしたいと思っています。 F_抽出←抽出用フォーム syurui←非連結のテキストボックス名 抽出←コマンドボタン T_データ 番号(主キー)、氏名、住所、性別、種類(テキスト型)、・・・ F_結果←抽出条件を反映するフォームで、T_データの項目をすべてリスト形式で表示出来る様にしています。 色々調べてみて、下記の設定をしてみました。 Private Sub 抽出_Click() Dim strFilter As String strFilter = "*" & Replace(Me.syurui, " ", "* Or *") & "*" strFilter = BuildCriteria("種類", dbText, strFilter) DoCmd.OpenForm "F_結果", , , strFilter End Sub 実行してみると、実行時エラー 2431 指定した式の構文が正しくありません。と表示されてしまいます。 4行目を下記に書換えてみたのですが、 strFilter = BuildCriteria([T_データ]![種類], dbText, strFilter) 実行してみると、実行時エラー 2465 指定した式で参照されている'|'フィールドがみつかりません。 と表示され、希望通りの結果が得られません。 アクセス初心者の為、説明がわかりづらかったり情報が足りないかもしれませんが、すぐに補足致しますのでどうぞよろしくお願い致します。

  • Accessクエリの抽出条件にフォームから挿入する方法

    Accessフォームのテキストボックスに入力されたデータを、クエリの抽出条件に挿入したいのですが、その際部分一致で検索したいため、抽出条件にLike "*[Forms]![フォーム名]![テキストボックス名]*"と記述したのですがうまく行きません。 どのように記述すれば部分一致で検索できるのかお教えください。

  • Accessで「キーワード検索」をしたい

    前任者が作ったデータベースを触っています。 私自身はAccessの基本操作がわかるくらいでVBAとかはよくわかりません。 今回その修正がしたいと思っています。 検索用フォームがあり、現在3つのコンボボックスがあってそれを選択して 「検索開始」をしています。 今回、その検索用フォームに「キーワード検索」というテキストボックスを1つ追加したいです。 検索の対応となるフィールドは2つあります。 「質問」「回答」 このどちらかのフィールドに「キーワード検索」した文字があればレコードを抽出してほしいです。 とりあえず検索結果を表示するためのクエリの「質問」「回答」の抽出条件に同様に Like "*" & [Forms]![F_検索フォーム]![キーワード] & "*"と入れてみました。 なんとなく違う気はするのですが、どうやってやれば良いのかイマイチわかりません。 またこの同じクエリに IIf(IsNull([Forms]![F_検索フォーム]![区分1cd]),True,[区分1cd]=[Forms]![F_検索フォーム]![区分1cd]) 抽出条件欄に「True」 これが3つのコンボボックス分あります。 何のためのフィールドでしょうか? また、私が追加する「キーワード検索」テキストボックスの分も作らないといけないものでしょうか? 素人質問で申し訳ありませんがアドバイスいただけたら助かります。 Accessのテキストは職場にたくさんあるのですが、私のレベルでは読んでも??ばかりです。 よろしくお願いします。

  • Accessの検索フォーム

    以前にも似たような質問をして、その時は解決したのですが、また同じようなことでつまづいて、以前の回答をみて、 そのとおりにやってるつもりなのに、できなくて…。 テーブル1とフォーム1・フォーム2があります。 フォーム1に入力された情報をもとに、テーブル1の内容を検索して、フォーム2に表示するものを作成しています。 テーブル1には「***.***.**.☆」(情報)という形の情報が入っています。 *の部分の桁数は固定で☆は不定形です。(テキスト形式) フォーム1に入力された情報は「(***.***.)**.*」(検索1)や「(***.***.)**.**」(検索2)などです。 ※()内は入力せず テーブル1の情報の9文字目以降と、フォーム1に入力された情報を比べたくて、以下のようなものを作成しました。 (多少省略等があります) condKensaku = "(Mid(Val(テーブル1.情報),9) between " & Val(Me!検索1.Value) & " and " & Val(Me!検索2.Value) & ")" wherecond = condKensaku DoCmd.OpenForm "フォーム2", acNormal, WhereCond これを実行すると 実行時エラー '2501': OpenForm アクションの実行はキャンセルされました。 と出て、デバッグを押すと、 DoCmd.OpenForm "フォーム2", acNormal, WhereCond の行が黄色になります。

  • 【Access】複数フィールドを対象とする検索

    Access上で「検索ボタン」をクリックすると、 「データ」フォームのフィールド1、フィールド2、フィールド3のいずれかに「検索条件1」の語を含み、かつ、フィールド4、フィールド5、フィールド6のいずれかに「検索条件2」の語を含むレコードを抽出できるようにしたいと思います。 検索条件はテキストボックスに入力するようにしており、テキストボックス名は「検索条件1」、「検索条件2」となっています。 以下のコードでやってみたのですが、「実行時エラー13、型が一致しません」というエラーが出てうまく抽出できません。 Private Sub 検索ボタン_Click() Dim filter1 As String filter1 = "フィールド1 like '*" & Me!検索条件1 & "*' or フィールド2 like '*" & Me!検索条件1 & "*' orフィールド3 like '*" & Me!検索条件1 & "*'" And " フィールド4 like '*" & Me!検索条件2 & "*' or フィールド5 like '*" & Me!検索条件2 & "*' orフィールド6 like '*" & Me!検索条件2 & "*'" DoCmd.OpenForm "データ", acNormal Forms!データ!.filter = filter1 Forms!データ!.FilterOn = True End Sub 「検索条件1,2」のテキストボックスがあるフォーム上の「検索ボタン」をクリックすると、 「データ」フォームが開き、検索をかけるという流れをイメージして作成 しています。 どなたか正しい記述を教えていただけませんでしょうか。 よろしくお願いいたします。

  • AccessでBetween条件を含むクエリーで、Between条件を

    AccessでBetween条件を含むクエリーで、Between条件を入力しなくてもデータを抽出するには? Access97でデータの抽出を行いたいと思います。 「顧客名」「商品名」「出荷日」という項目を含むクエリーから、希望のデータを抽出するフォーム(名:検索フォーム)を作成しています。 検索フォームにそれぞれ「顧客名」「商品名」「出荷開始」「出荷終了」という名前の非連結のテキストボックスを作り(規定値を"*"にしています)、それに値を入力すると、これらのテキストボックスの下に配置したサブフォームに抽出されたデータが抽出される様にしたいのです。 現在、クエリーの「顧客名」項目の抽出条件に「[forms]![検索フォーム]![顧客名]」という様に入力し、同じ様な記述を「商品名」項目にも行い(条件は[商品名]としています)、出荷日に「Between[forms]![検索フォーム]![出荷開始]And[forms]![検索フォーム]![出荷終了]」と記述しています。(これらは全てAnd条件にしています) さて、この検索フォームの値入力項目で、全てのテキストボックスに入力しなくても(1つ以上値が入力されていれば)データをサブフォームに抽出できるようにしたいのです。 現在、「出荷開始」&「出荷終了」に値を入力すれば、その他の値(「顧客名」と「商品名」)を入力してもしなくてもデータが抽出できますが、「出荷開始」&「出荷終了」を入力しない限りデータが抽出されません。 この「出荷開始」&「出荷終了」を入力しないケースでもデータが抽出できる様なフォームを作成したいのですが、 どの様に記述を変えたらよいでしょうか?

専門家に質問してみよう