FindFirst複数条件でのレコード検索がうまくいかないエラーの解決方法

このQ&Aのポイント
  • VBAのコードを使用して、フォームの2つのコンボボックスで条件を指定し、テーブルからレコードを検索する際、複数条件での検索がうまくいかないエラーが発生します。
  • 単純なAndで条件を結合するだけでは解決せず、条件指定の方法に問題がある可能性があります。
  • FindFirstメソッドを使用する際に条件を複数指定するには、条件ごとにFindFirstメソッドを別々に使用し、その結果を組み合わせて判定する必要があります。
回答を見る
  • ベストアンサー

FindFirst複数条件

access 超初心者です。 フォームに2つのコンボボックス(COM_A,COM_B)があり そのコンボボックスで条件を2つ設定し、テーブル(TBL)から 条件の一致したレコードを検索したいのですが、うまくいきません。 TBLのフィールド AAA ---> COM_Aで指定 BBB ---> COM_Bで指定 Dim db As DAO.Database Dim TBL As DAO.Recordset Set db = CurrentDb Set TBLrs = db.OpenRecordset("TBL", dbOpenDynaset) TBLrs.FindFirst"AAA='"&Me.COM_A&"'"And"BBB='"& Me.COM_B & "'" If TBLrs.NoMatch Then 処理 Else 処理 End If というコードなのですが、実行すると『型が一致しません』となってしまいます。 TBLrs.FindFirst"AAA='"&Me.COM_A&"'" If TBLrs.NoMatch Then ~ とか TBLrs.FindFirst"BBB='"&Me.COM_B&"'" If TBLrs.NoMatch Then  ~ のように条件を1つにすると各々問題なく動作します。 単純にAndでひっつけるだけではダメなのでしょうか? いろいろ調べましたが、完全に行き詰ってしまいました。 ヒントでもいただければありがたいです。 よろしくお願いします。

  • man_u
  • お礼率70% (56/80)

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

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.1

>TBLrs.FindFirst"AAA='"&Me.COM_A&"'"And"BBB='"& Me.COM_B & "'" 恐らく『「And」は文字列として渡す必要があるから』と考えられて 「"And"」という形で挿入されたのだろうと思います。 確かにそう(=文字列として渡す必要がある)なのですが、そのためには、その前の 「AAA='」という文字列と、「Me.COM_B」というコンボボックスへの参照式とを 結合させた場合と同様に、「&」を使ってやる必要があります。 なお、文字列が連続する場合は、「"~"& "~"」とする代わりに、文字列全体を 一組の「""」で囲って「"~~"」とすることもできます。 ですので、上記の部分を  TBLrs.FindFirst "AAA='" & Me.COM_A & "'" & " And " & "BBB='" & Me.COM_B & "'" とするか、または連続する文字列をひとつにまとめて  TBLrs.FindFirst "AAA='" & Me.COM_A & "' And BBB='" & Me.COM_B & "'" と修正すれば、正しく動作するかと思います。 (「And」の前後には、ともに半角スペースが必要なので注意)

関連するQ&A

  • FindFirst(ACCESS VBA)についての質問

    あるシステムをつくっているのですが、 FindFirstですでに入力されているIDと今入力されたIDとを比べて、 ~.FindFirst("ID=" & newID) If ~.nomatch=false then 処理 endif というように 一致したら処理をするのですが、このFIndFirst文でIDだけでなくID2というのも一致しないと処理を行わないというのにするにはどのようにすればいいでしょうか? たぶんANDを使えばいいのではないかと私は思うのですが、どのように記述してもいいのかわかりません。 あと、上に記述されているコードにももっとこうしたほうがいいなどというアドバイスをいただけたら幸いです。 みなさんよろしくお願いします。

  • ExcelからAccessデータを検索するマクロ

    Excel、Accessとも初心者です。 下記を参考にさせて頂いております。 http://okwave.jp/qa/q441987.html これを、(1)~(3)に対応させたいのですが どのように書き換えればよろしいのでしょうか? (1)A1→ A列の最後まで (2)対応するレコードフィールド2   → 規定した複数のレコードフィールド     (例えば、フィールド3とフィールド5とフィールド8) (3)Excel, Accessともに2007です。 (4)検索の経過は表示させない  (少しでも早く処理したい。ひとつひとつ検索結果を表示すると遅くなると聞ききました) ・・・・・・・・・・・・・・・・・・・・・・・・・ Sub Macro1() Dim db As DAO.Database Dim rs As DAO.Recordset Set db = OpenDatabase("c:\abc.mdb") Set rs = db.OpenRecordset("tbl_a", dbOpenDynaset) rs.FindFirst "[フィールド1]='" & Range("A1").Value & "'" If rs.NoMatch Then   Range("B1").Value = "" Else   Range("B1").Value = rs![フィールド2] End If rs.Close Set rs = Nothing Set db = Nothing End Sub ・・・・・・・・・・・・・・・・・・・・・・・・・ よろしくご教授お願いします。

  • DAO findfirst ついて教えてください。

    下記のように記述し実行しているのですが、  実行時エラー'3077'  式の構文エラー:演算子がありません というエラー(下記===>)がでます。別なTBLではちゃんとfindfirst を使い結果がでているのですが、このイベントだけうまくいきません。 ちなみに、findfirst行をコメントにするとTBL1行目を読み込んでくれます。 Private Sub in_lot_no_AfterUpdate() Dim dbDAO As DAO.Database Dim rsDAO As DAO.Recordset Dim wkJOUKEN As String Set dbDAO = OpenDatabase("\\Network-SV\factory.mdb") Set rsDAO = dbDAO.OpenRecordset("JI_NYUKAJI", dbOpenDynaset) wkJOUKEN = "LOTNO=" & Me!in_Lot_No  '非連結入力TXT-BOX ===>rsDAO.FindFirst wkJOUKEN If rsDAO.NoMatch Then MsgBox ("入荷情報が存在しません。") Else Me!in_nyuukaday = rsDAO![NYUKADAY] Me!in_shubetu = rsDAO![KATASIKI] End If rsDAO.Close: Set rsDAO = Nothing dbDAO.Close: Set dbDAO = Nothing End Sub 初心者ですがよろしくお願いいたします。

  • Excel2002:複数条件のデータの個数の集計

    苦手な集計について質問させてください。 [A] [B] [1] AAA aaa [2] BBB bbb [3] AAA aaa [4] AAA bbb [5] BBB ccc 上記のようなデータで[A]と[B]のAND条件でみたときの個数を集計したいと思います。 例えば上記であれば、 [A]AAAかつ[B]aaa・・・2個 [A]BBBかつ[B]bbb・・・1個 [A]AAAかつ[B]bbb・・・1個 [A]BBBかつ[B]ccc・・・1個 になります。[B]のデータは[A]のデータに依存せず、[A]の各値にまたがっています。([B]bbbは[A]AAAと[A]BBBの場合があります) 実際のシートでは、全パターンを網羅したリストがA列とB列、集計対象がD列とE列にあります。 上記の例でいえば、以下のようになっています。 [A] [B] [C] [D] [E] [1] AAA aaa AAA aaa [2] AAA bbb BBB bbb [3] BBB bbb AAA aaa [4] BBB ccc AAA bbb [5] BBB ccc つまり[A]列と[B]列が組み合わせパターン、[D]列と[E]列が集計元データです。 ちなみにパターン数が414個、集計元データは29000個程度です。 そして最終的な各パターンの個数を[C]列に表示させたいと思います。 VLOOKUPやピボットテーブルを考えましたが、ピンと来ません。 適切なやり方を教えてください。よろしくお願いします。

  • SQL文について

    TBL_A カラム1 |カラム2 |カラム3 |カラム4 | ---------|---------|---------|---------| 1    |AAA   |N    |1    | ---------|---------|---------|---------| 2    |AAA   |G    |1    | ---------|---------|---------|---------| 3    |BBB   |N    |0    | ---------|---------|---------|---------| 4    |CCC   |N    |0    | ---------|---------|---------|---------| TBL_B カラム1 |カラム2 | ---------|---------| AAA   |2    | ---------|---------| BBB   |0    | ---------|---------| CCC   |1    | ---------|---------| 上記のテーブル、TBL_A、TBL_Bがあるとします。 TBL_Aからカラム3='N'を抽出し、TBL_Bのカラム2でソートしたいのですが、 可能でしょうか? 結果 ---------|---------| BBB   |0    | ---------|---------| CCC   |1    | ---------|---------| AAA   |2    | ---------|---------| …となって欲しいのですが。。。 select TBL_A.カラム2 from TBL_A, TBL_B where TBL_A.カラム3='N' order by TBL_B.カラム2 では、うまくいきませんでした。 ※ TBL_A、TBL_Bは共にカラム1がキー値です。

  • 複数条件のDLOOKUP文が上手く使用できない

    現在、ACCESSVBAを用いての作業を行っているのですが、 判定条件として複数条件をDLOOKUP文を使用すると実行時にエラーとなるなどして、 上手く動作しません。 おかしな点がありましたら指摘していただけますでしょうか。 対象テーブルのフィールドAAA~は全てテキスト型となっております。 Me!txtはフォーム上から取得した値、 aaaaはそこまでの処理に使用した変数、 rsはレコードセットとなっております。 レコードセットはExcelのセルを読み取ったデータが格納されており、 これらの変数はそのまえの処理で正常に取得を確認しています。 If DLookup("AAA", "TBL", _"BBB ='" & Me!txt & "'" And _"CCC = '" & aaaa & "'" And _"CCC = '" & Left(rs(1), 3) & "'") = Null Then よろしくお願いいたします。

  • vbsのif文で複数条件の判定

    例えば以下である場合、 WScript.echo AAA WScript.echo BBB vbsを実行すると "?"が表示されます。 "OK"が表示されない原因として考えられる事はありますでしょうか If AAA = false Then If BBB = false Then WScript.echo "OK" else WScript.echo "NG" End If else WScript.echo "?" End If

  • 日付の最大値を求めるには

    DLookup関数と、DMAX関数を組み合わせて、検索をすれば良いのですが、 表示する項目が多い為、DAOを使って検索を考えています。 検索するコードが複数存在し、最大の日付のレコードを表示 したいと思っています。 コードの名称は・・・ Quotation_B_Noです。 日付が入っている名称は Input_dayです。 フォーム内のMe.W_Revise_Noにコードを入力して、検索を行います。 検索するテーブルは、T_Quotation_B_request_received_tableです。 この中にある。 コードを最初にあるか、どうかをチェックして、 あれば、そのコードに対する、最大の日付のレコードを 検索したいと思っています。 現在、このように組みましたが、 Dim db As DAO.Database Dim rs As DAO.Recordset Dim han As Date Set db = CurrentDb() Set rs = db.OpenRecordset("T_Quotation_B_request_received_table", dbOpenDynaset) rs.FindFirst "Quotation_B_No ='" & Me.W_Revise_No & "'" If rs.NoMatch = True Then MsgBox "Not found Supplier code" Cancel = True Me.W_Revise_No.Undo Exit Sub Else han = DMax("Input_day", "T_Quotation_B_request_received_table ", "Quotation_B_No ='" & Me.W_Revise_No & "'") rs.FindFirst "#" & "han" & "#" And "Quotation_B_No ='" & Me.W_Revise_No & "'"→ここで、エラーが発生します。 Me.W_Control_No = rs!Control_No       ・・・・・ End If rs.Close Set rs = Nothing db.Close Set db = Nothing どのように組めば良いのか、さっぱり分かりません。 ご指導、宜しくお願いします。

  • 異なるDB間でのJOINやVIEWについて

    Sybaseを使っています。  aaa  bbb の2つのDBを使っています(オーナーはともにxxx)。  DB名aaaには、a_tblが  DB名bbbには、b_tblがあるものとします。 ここで、例えばa_tblを検索したい場合、 use aaa go select * from xxx.a_tbl go で検索結果は得られると思いますが、 b_tblとのJOINを行いたい場合は use bbbの宣言も必要だと思うのですが、どうすれば可能でしょうか? また、あらかじめ、異なるDBにまたがるa_tblとb_tblを結合させたVIEWを 作成することは可能なのでしょうか? 可能であればその方法を教えてください。

  • If~Elseif分で複数の条件式を書くには?

    毎度です。Access2000で悩んでいます。 フォームにいくつかのコンボボックスを設定してあります。 (コンボ1、コンボ2、コンボ3) この時に各コンボボックスの値を元にそれぞれ違うクエリを走らせたいのですがどうやって書けばいいのでしょうか? If Me!コンボ1 = 1 + コンボ2 = 1 + コンボ3 = 1 Then Docmd.OpenQuery "Query1" ElseIf Me!コンボ1 = 1 + コンボ2 = 1 + コンボ3 = 2 Then Docmd.OpenQuery "Query2" って書いてみたのですが、ダメでしょうか? 条件を複数書く時って「+」でつなげないのでしょうか? 素人です。やさしく教えてください。