VBAの検索抽出がうまくいかない原因と解決方法

このQ&Aのポイント
  • アクセスVBAでの検索抽出を実行する際に起こる問題とは、抽出条件の記述に問題があることが考えられます。
  • 検索条件を入力しているにもかかわらず、すべてのデータが表示される原因は、IF文での条件分岐が正しく機能していないためです。
  • 各テキストボックスの値が空でない場合に、抽出条件としてクエリに追加するよう条件文を組み立てていますが、誤った処理が行われている可能性があります。
回答を見る
  • ベストアンサー

アクセスVBA(先日の続きになります)

前回教えていただきました検索抽出のVBAですが、抽出がうまくできなくなってしまいました。 抽出条件を入力しているにもかかわらず、全部のデータが表示されてしまいます。 どこがまずいのかわかりましたら、ぜひ教えてください。 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 "検索結果", , , kensakum, acFormReadOnly DoCmd.Maximize DoCmd.Close acForm, Me.Name End If End Sub

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

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

ご返事遅くなりまして。ごめんなさい。 If Not Me![t_04] = "" Then kensaku = kensaku & _ "(IsNUll([舗装施行年度] OR " & _ "([舗装施行年度] Like '*" & Me![t_04] & "*')) AND " 「& _ 」が抜けてました。文字列生成ですら必要です。コペミスでした。ごめんなさい。

n-shan
質問者

お礼

ほんとうに何度も何度もありがとうございました。 無事検索できました。 「& _ 」ですか~ なぜ気づかなかったんだろう… やはり基本を理解していないからちょっとトラブルとどうにもならなくなってしまうんですね もっともっと勉強します。 またわからないコトが出てきましたら、「またかよ~」と言わずアドバイスをよろしくお願いいたします。

その他の回答 (3)

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

あぁ、また間違った。 If Not Me![t_04] = "" Then kensaku = kensaku & _ "(IsNUll([舗装施行年度] OR " "([舗装施行年度] Like '*" & Me![t_04] & "*')) AND " です。カッコが一つ多かったです。ごめんなさい。

n-shan
質問者

補足

何度もありまがとうございます。 教えていただきましたコードでやってみたんですが、エラーが出てしまいました。 私が持っているマニュアル本には載っていなかったので、"()"をつけたりはずしたりといろいろやってみましたが、どこがエラーなのか発見できず、またまたお返事してしまいました。 "(IsNUll([舗装施行年度] OR " "([舗装施行年度] Like '*" & Me![t_04] & "*')) AND " ORとAND間は普通に改行してかまわないんですよね? どうか見捨てずご享受ください。

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

そう来ましたか。(笑) いつ言われるか…、気がきでは無かったす。(^^; その項目に'Null'が入っているためです。nullを検索する場合は、名指しでIsNull([舗装施行年度])という風に検索しないとヒットしません。 If Not Me![t_04] = "" Then kensaku = kensaku & _ "([舗装施行年度] Like '*" & Me![t_04] & "*') AND " は、 If Not Me![t_04] = "" Then kensaku = kensaku & _ "(IsNUll([舗装施行年度]) OR " "([舗装施行年度] Like '*" & Me![t_04] & "*')) AND " で、Nullが検索項目の一部のレコードにあってもヒットすると思います。

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

こんにちは。 >DoCmd.OpenForm "検索結果", , , kensakum, acFormReadOnly は、kensaku では?

n-shan
質問者

お礼

うっ、ありがとうございました。 その通りでした。おはずかしい… さらにお聞きしてもよろしいでしょうか? 検索項目がたくさんあるんですが、その中の2つとか3つにデータが入っていない場合、まるごとそのレコードが抽出されないのですが、質問に載せたコードでは抽出しないのでしょうか? 検索は、データの入っている部分でやっているんですが… ためしにテーブルで「0」(ゼロ)を入力して検索してみたんですが抽出されませんでした。 おんぶにだっこ状態で申し訳ありませんが、おわかりになりましたら教えてください。

関連するQ&A

  • Accessについて質問です。

    Win2000、Access2000を使用しています。 何件か教えて頂きたいことがあります。 1)「アプリケーションの実行」でAdobeAcrobatを起動させることは可能ですか。 2)ハイパーリンクしたオブジェクトにフォーカスした時、マウスポインタが指マークにならないで普通の矢印マークにすることは可能ですか。 3)5月頃にこのページで教えて頂いた検索をするVBのコードについてですが、 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 kensaku <> "" Then   kensaku = Left(kensaku, Len(kensaku) - 5)   DoCmd.OpenForm "検索結果", , , kensaku, acFormReadOnly   DoCmd.Maximize   DoCmd.Close acForm, Me.Name  End If End Sub 以上のコードを教えて頂いてうまく検索できるようになったんですが、 kensaku = kensaku & … イコール(=)の後の kensaku の意味と、 If kensaku <> "" Then kensaku = Left(kensaku, Len(kensaku) - 5) この2行は、どのような動きをするためのコードなのか理解できませんでした。 質問がたくさんありますが、どなたか1つでもおわかりになる方いましたら、お教えください。

  • Access VBA  複数検索方法(初心者)  

    下記の様に検索すると、 "テキスト名称"と"テキスト分類"の2つのテキストボックスを使用して検索ですが、 1つのテキストボックス"テキストA"で両方(名称・分類)又は2つ以上を検索させるには、どのようにしたら良いでしょうか? <テキストボックス1つでテーブル全部を検索したい> ご教授お願い致します。(Access2000) Private Sub コマンド17_Click() Dim st As String If Not IsNull(Me.テキスト名称) Then st = st & " AND 名称 like'*" & Me.テキスト名称 & "*'" End If If Not IsNull(Me.テキスト分類) Then st = st & " AND 分類 like '*" & Me.テキスト分類 & "*'" End If st = Mid(st, 6) DoCmd.OpenReport "レポート", acViewPreview, , st End Sub

  • Accessフォームでの複数条件検索

    検索用テキストが4つとコンボボックスが1つあり、検索ボタンというコマンドボタンを押すと 該当するレコードを表示させるフォームを作りました。 以下がそのVBAです。 Private sub 検索ボタン_click() Dim strfilter As String, strexp As String, aryope As Variant If Not IsNull (me.一) Then strfilter = "And 出版社 Like '*" & Me.一 & "*'" End If If Not IsNull (me.コンボ62) Then strfilter = "And 種類 Like '*" & Me.コンボ62 & "*'" End If If Not IsNull (me.三) Then strfilter = "And 番号 Like '*" & Me.三 & "*'" End If If Not IsNull (me.四) Then strfilter = "And 発刊日 = # " & Format (me.四. "yyyy-mm-dd") & "#" End If If Not IsNull (me.一) Then strfilter = strfilter & " AND " & BuildCritera ( "タイトル", dbText, "*" Replace ( me.五, "", "*AND*") & "*") End If 改正したいことは   1. 検索用テキストボックスに入力された値全てを満たすレコードを表示したい(現在は例えば     出版社、タイトル、番号の3つを入力するとそれぞれの項目にヒットする物がすべて検出さ     れる)   2. テキストボックス[三]の番号は完全一致で抽出したい(26を抽出したいのに126や2673     等も抽出されてしまう)   3. テキストボックス[四]の発刊日は西暦表示から和暦で入力して検索したい     (テキストボックス[四]をコンボボックスに変え、西暦・和暦両方表示にし、[四A]を追加して     月日という名前にしてこれら年月日をくっつけて完全一致で検索する方法を考えましたが     記述がわかりません)   5.タイトルがWeb検索の様に複数曖昧検索ができない     中途半端な検索で抽出してる状態です。     どなたか手直しいただけますでしょうか? 

  • アクセスのVBAについて

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

  • access VBA処理がうまくいかない

    お世話になります。 T_請求に追加する追加クエリQ_家賃請求Tがあります。 どの物件を更新するかをチェックボックスで指定し、追加クエリの抽出条件にしています。 月に1度のみの操作ですが、数人でこのデータベースを触り、 何度も追加されると困るので2度目以降はエラー処理をさせたいと思っています。 Private Sub 更新_Click() Dim ret As Integer ret = MsgBox("チェック物件を請求更新します。" & vbCrLf & "よろしいですか?", _ vbYesNo + vbQuestion, "請求月次更新") If ret = vbYes Then If DCount("[契約者CD]", "[T_請求]", "[物件CD] = " & Me!物件CD & _ " AND [T_請求]![請求年月] > #" & DateSerial(Year(Date), Month(Me![処理日]) + 1, 1) & "#") _ <> 0 Then MsgBox "すでに指定物件の請求は更新されています" & vbCrLf & _ "同じ月に請求を2度更新できません" Else DoCmd.SetWarnings False DoCmd.OpenQuery "Q_家賃請求用T" MsgBox "更新されました" DoCmd.SetWarnings True End If Else If MsgBox("処理を中止しました", vbOKOnly + vbDefaultButton1 + vbExclamation) = vbOK Then Me.Undo Cancel = True End If End If End Sub 以上のようなコードを書きました。 処理が正しくできているか確認のために、動作を調べたのですが、 まったく同じ請求年月で同じ物件CDのものが保存先のテーブルに処理されてしまいます。 どの部分を直せばいいのでしょうか? 足りない情報があれば提示しますので、よろしくお願いいたします。

  • accessの検索フォームについて(複数条件)

    access初心者です。 本などを参考に検索フォームを作成しました。 1つの条件で検索することは出来たのですが、複数の条件を入力するとうまく検索出来ません。 全ての条件を満たすデータの抽出を行いたいと思います。 「あ」「い」「う」というテキストボックスを用意しています。 Private Sub コマンド14_Click() If Not IsNull(Me.txt_あ) Then ' Me.Filter = "あ LIKE '*" & Me!txt_あ & "*'" End If If Not IsNull(Me.txt_い) Then ' Me.Filter = "い LIKE '*" & Me!txt_い & "*'" End If If Not IsNull(Me.txt_う) Then ' Me.Filter = "う LIKE '*" & Me!txt_う & "*'" End If Me.FilterOn = True End Sub よろしくお願いします。

  • アクセス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_用件フォームは開くのですが、きちんと検索されてきません。 どこが悪いのでしょうか? よろしくお願いします。

  • accessでのVBAで

    文字列を使用した分岐式を書きたいのですが、 If IsNull(DLookup("ナンバー", "T_名前", "ナンバー=" & CLng(Me!ナンバー))) Then となってるのを、文字列用にするために、 If IsNull(DLookup("ナンバー", "T_名前", "ナンバー=" & CStr(Me!ナンバー))) Then としてみましたが、型がダメということでどこかに「'」をつければいいのかと思ったのですが、どこにつけていいのか わかりません!! どこにつけたらいいのでしょうか? If IsNull(DLookup("ナンバー", "T_名前", "ナンバー='" & CStr(Me!ナンバー)')) Then とかしてみましたがダメでした…。

  • 以下のアクセスの検索フォームで。。。

    検索フォームの項目は以下の通りです。 ○ AND  ○ OR 名前  [    ] 項目  [    ]▼  [    ]▼  [    ]▼ もとになってるテーブルは ・名前 ・項目1 ・項目2 ・項目3 ・項目4 ・項目5 というようなっています。 検索ボタンのコードは Select Case Me!検索方法.Value Case 1 'or tempOper = " AND " strCount = 5 Case 2 'and tempOper = " OR " strCount = 4 End Select '名前 If Me!SyainName.Value <> "" Then condName = "(T_マスタ.氏名 like '*" & Me!SyainName.Value & "*')" WhereCond = WhereCond & tempOper & condName End If '項目 If Me!Koumoku1.Value <> "" Then condKoumoku1 = "(T_マスタ.項目1 like '*" & Me!Koumoku1.Value & "*')" condKoumoku2 = "(T_マスタ.項目2 like '*" & Me!Koumoku1.Value & "*')" condSKoumoku3 = "(T_マスタ.項目3 like '*" & Me!Koumoku1.Value & "*')" tempCond = tempCond & " OR (" & condKoumoku1 & " OR " & condKoumoku2 & " OR " & condKoumoku3 & ")" End If If tempCond <> "" Then tempComd = Mid(tempCond, 5) WhereCond = WhereCond & tempOper & "(" & tempCond & ")" End If WhereCond = Mid(WhereCond, strCount + 1) DoCmd.OpenForm "F_検索結果_一覧", acNormal, , WhereCond これを実行すると クエリ式 '(OR((T_マスタ.項目1 like …')の構文エラー:演算子がありません。 と出ます。 どこを訂正すべきでしょうか? (項目を含まない状態ではうまく検索できてました。) Access2000です。

  • 1つのテキストボックスで全フィールドを検索するには

    1つのテキストボックスで全フィールドを検索するには Access2002使用です。 現在フォームにて、それぞれのフィールド毎に検索用のテキストボックスを用意してる為、 下記のようになっています。 これを、1つのテキストボックスで全てのフィールドを検索できるようにするには、 どこを訂正したらよろしいでしょうか? 宜しくお願い致します。 Option Compare Database Function exeFilter() Dim strFilter As String If Not IsNull(姓検索) Then strFilter = " AND 姓 Like '*" & Me.姓検索 & "*'" End If If Not IsNull(名検索) Then strFilter = strFilter & " AND 名 Like '*" & Me.名検索 & "*'" End If If Not IsNull(姓ふりがな検索) Then strFilter = strFilter & " AND ふりがな(姓) Like '*" & Me.姓ふりがな検索 & "*'" End If If Not IsNull(名ふりがな検索) Then strFilter = strFilter & " AND ふりがな(名) Like '*" & Me.名ふりがな検索 & "*'" End If If Not IsNull(住所1検索) Then strFilter = strFilter & " AND 住所1 Like '*" & Me.住所1検索 & "*'" End If If Not IsNull(住所2検索) Then strFilter = strFilter & " AND 住所2 Like '*" & Me.住所2検索 & "*'" End If If Not IsNull(住所1ふりがな検索) Then strFilter = strFilter & " AND 住所1ふりがな Like '*" & Me.住所1ふりがな検索 & "*'" End If If Not IsNull(住所2ふりがな検索) Then strFilter = strFilter & " AND 住所2ふりがな Like '*" & Me.住所2ふりがな検索 & "*'" End If Me.Filter = Mid(strFilter, 6) Me.FilterOn = True End Function Private Sub Form_AfterUpdate() End Sub

専門家に質問してみよう