Access検索フォームの実行エラーの解決方法

このQ&Aのポイント
  • Accessの検索フォームで実行エラーが発生し、OpenForm アクションの実行がキャンセルされた場合の解決方法を解説します。
  • テーブル1とフォーム1・フォーム2を使用して、フォーム1に入力された情報をもとにテーブル1の内容を検索し、フォーム2に表示するシステムを作成しています。
  • DoCmd.OpenForm 関数を使用してフォーム2を開こうとした際に、「実行時エラー '2501'」というエラーが発生し、OpenForm アクションの実行がキャンセルされます。このエラーの解決方法として、Where 条件式を正しく設定することが重要です。
回答を見る
  • ベストアンサー

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 の行が黄色になります。

  • w-inty
  • お礼率72% (1169/1618)

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

  • ベストアンサー
回答No.6

SELECT * FROM [テーブル1] WHERE [(Val(Mid(テーブル1.情報,9)) between 10.3 and 10.5)] ごめんなさい、#5の回答で書いたSQLの [ ] の記号は 書き換えてもらう部分をはっきりさせるためにつけただけであって 実際のSQLには [ ] の記号そのものは不要です。 SELECT * FROM テーブル名 WHERE 条件式 という形でクエリを作成して実行してみてください。

w-inty
質問者

お礼

回答ありがとうございます。 すいません、勘違いしてたみたいですね(^^; []をとってみたところ、少し前進?しまして、クエリーのデザインビューはみれるようになりました。 (型が一致しません、というエラーは出てしまいますが。) もうだんだん分からなくなってきてしまったので(>_<)今回はボタンひとつでの検索を諦めて、 クエリーを一旦挟んだ検索にしようかと思ってきました。 これなら無事思うように検索できました…。

その他の回答 (5)

回答No.5

(Val(Mid(テーブル1.条件,9)) between 10.3 and 10.5) ↑コピーしていただいたこの文字列なら (テーブル名・フィールド名が間違っていなければ)条件式として問題はないように見えます。 クエリを新規作成し、SQLビューで SELECT * FROM [実際のテーブル名] WHERE [Debug.Print condKensakuで出力された文字列のコピペ] ※[ ]の部分はそちらの環境に合わせて置き換えてください。 というSQLを入力し、そのクエリが正しく動くかどうか 期待した結果が得られるかどうかを確認してみてください。 正しく動かないようであればやはり ・テーブル、フィールドの構造 ・実際にテーブルに格納されているデータの内容 ・condKensakuとして作成された条件式 のいずれかに問題があると思われますが そのクエリが正しく動くのであれば、どこか他の部分に原因があると思われますので これ以上こちらで判断できそうにはありません。

w-inty
質問者

お礼

回答ありがとうございます。 クエリを作成し、以下をSQL文にいれてみました。 SELECT * FROM [テーブル1] WHERE [(Val(Mid(テーブル1.情報,9)) between 10.3 and 10.5)] クエリを実行しようとすると、そのクエリが見つかりません、というエラーが出てきました。 ということはやはりどこかが違うということですね… もうちょっと見直してみたいと思います。

回答No.4

(Val(Mid(テーブル.情報,9)) between 10 and 12) ↑今度の文字列はイミディエイトウィンドウからコピーしたものですか? テーブルの名前は「テーブル1」(数字は全角)ではなかったのですか? カンマの数が違っていたり、半角/全角が違っていたり、テーブルの名前が違っていたり... 書き込まれる度に内容が変わっており それぞれプログラムとしてはまるで違う意味になってしまうため これでは正確な原因を判断しようがありません(^^;;; Debug.Print condKensaku を実行して、イミディエイトウィンドウに出力された文字列と テーブル、フィールドの正確な名称を 手で入力するのではなく、コピー&ペーストで貼り付ける形でお教えください。

w-inty
質問者

お礼

回答ありがとうございます。 これがコピーしたものです。 3 5 (Val(Mid(テーブル1.条件,9)) between 10.3 and 10.5) (テーブル名や、フィールド名は実際に行っているものと、質問した文では変わっているため、それを直し忘れなどで多少違うこともありますが、テーブル名の指定等は名前は間違っておりません)

回答No.3

Debug.Printの結果の (Val(Mid(テーブル1.情報,9)) between 3 and 15) ↑この文字列が、イミディエイトウィンドウからコピペしたものであるならば 括弧の記号が全角になっている部分があります。 ※最初の3つと最後の1つ 条件式の中で全角括弧が使われているならば、エラーの原因はそれだと思われます。 ※全角の括弧は特別な意味を持つ記号ではなく、単なる文字と見なされてしまいます。

w-inty
質問者

お礼

すいません、写し間違いというか、自分で入力をしたので全角になっていました。 実際は半角です。 (Val(Mid(テーブル.情報,9)) between 10 and 12)

回答No.2

#1です。 そうなるとやはり怪しいのは検索条件の文字列ですね。 最初の質問に書かれていたように Mid(Val(テーブル1.情報),9)      ↓ Val(Mid(テーブル1.情報,9)) に変えて実行してみてください。 Valは文字列の先頭から数値と見なせる部分を取り出して数値化する関数なので Val("123.456.78.9") だと戻ってくる値は 123.456 になります。 (※小数点が2個つくのは数値ではありえないため、数値とみなせるのは123.456まで) その後でMidを実行しても数字は7桁しかないため空の文字列しか返ってきません。 クエリのSQLビューで SELECT Mid(Val(テーブル1.情報),9), Val(Mid(テーブル1.情報,9)) FROM テーブル1 と入力して実行してみると違いが良く分かるかと。 それでもだめなら、Docmd.OpenFormのすぐ上に Debug.Print Val(Me!検索1.Value) Debug.Print Val(Me!検索2.Value) Debug.Print condKensaku の3行を追加して、イミディエイトウィンドウに表示される結果を確認してみてください。

w-inty
質問者

お礼

回答ありがとうございます。 ためしに 検索1→3 検索2→15 を入力して、実行して、イミディエイトウィンドウに表示されたものを確認すると 3 15 (Val(Mid(テーブル1.情報,9)) between 3 and 15) となっています。 (MidとValの位置は変更しました。) 見た感じなんとなくあってるような気はしないでもないんですが。。 どこか間違ってるでしょうか?

回答No.1

どうも、せっかくなのでこちらにも回答させて頂きますね。 ACCESSのバージョンに依存するかもしれませんが、まず単純に DoCmd.OpenForm "フォーム2", acNormal, WhereCond          ↓ DoCmd.OpenForm "フォーム2", acNormal, , WhereCond に変えて実行してみてください。 Docmd.OpenFormの3番目の引数FilterNameは、フィルタ用として作成済みの「クエリの名前」を指定するものです。 つまりここにcondKensakuの文字列を入れてしまうと 「(Mid(Val(テーブル1.情報),9) between ~」という名前のクエリを探しにいってしまいます。 検索条件の式を文字列で作ったならば、それは4番目のWhereConditionの引数として渡す必要があります。 (以上はACCESS 2003での話です) それで上手くいかないようであれば ・テーブル1の情報に半角数字、半角ピリオド(小数点)以外の文字が入っていないか ・フォーム1の検索1、検索2の欄に半角数字、半角ピリオド以外の文字が入っていないか ・フォーム2のレコードソースがテーブル1となっているか といったあたりを確認してみてくださいね。

w-inty
質問者

お礼

再度回答ありがとうございます。 こちらが使用しているAccessは2002です。 すいません、写し間違いで、 DoCmd.OpenForm "フォーム2", acNormal, , WhereCond と,が2個入ってました。 ちなみにこれを1個にしてみると、フォームは表示されましたが、検索条件は無視されているようです。 >・テーブル1の情報に半角数字、半角ピリオド(小数点)以外の文字が入っていないか 入っていたので、他へ移動させて、数字・ピリオドのみにしました。 >・フォーム1の検索1、検索2の欄に半角数字、半角ピリオド以外の文字が入っていないか はい、大丈夫です。入っていません。 >・フォーム2のレコードソースがテーブル1となっているか はい、なっています。 他の検索の箇所の結果としてこのフォーム2を使っていて、他の検索ではちゃんとなっているので、フォーム2に異常はなさそうです。 上記をやってみましたが、やはり同じメッセージが!

関連するQ&A

  • Accessの検索で「~以外」

    VBAで検索フォームを作成しています。 普通は「○○にあてはまるもの」という検索ですが、 「○○以外のものを検索」というようにしたい場合はどのようにすればいいのでしょうか? 通常の検索はこんな感じです。 If Me!検索値.Value <> "" Then condKey = "(T_マスタ.フィールド like '*" & Me!検索値.Value & "*')" WhereCond = WhereCond & tempOper & condKey End If WhereCond = Mid(WhereCond, strCount + 1) DoCmd.OpenForm "F_検索結果", acNormal, , WhereCond access2000です。

  • Access検索フォームで範囲を指定しての検索

    クエリーで計算して出した結果をもとにフォームを使って検索をしたいのですが、うまくできません。 クエリーの計算式は誕生日から年齢を出すものが入っています。 フォームのボタンにVBAで '年齢 If Me!年齢開始.Value <> "" Then Age1 = "(Q_メイン.年齢 >= " & "0" & " and =< " & Me!年齢終了.Value & ")" WhereCond = WhereCond & tempOper & Age1 End If WhereCond = Mid(WhereCond, strCount + 1) DoCmd.OpenForm "F_検索結果", acNormal, , WhereCond となっています。 tempOperは、検索方法がORとANDが選べるようになっていて、それの結果が入っています。

  • アクセス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の検索フォーム作成で。

    Access2000です。 一覧テーブルは ・名前 ・項目1 ・評価1 ・項目2 ・評価2 となっていて、 山田太朗  | タバコのポイ捨てはしない  | 5 | 10分前行動 | 4 | 前田前   | 交通ルールを守る      | 5 | 挨拶をする  | 4 | 大坪拳   | 10分前行動        | 4 | 挨拶をする  | 5 | のようになっています。 これをもとに「検索フォーム」をデザインフォームで、 名前   [     ] 項目1  [     ] 項目2  [     ] 項目3  [     ] と作成し、「検索」というボタンを押すと、「検索結果フォーム」に検索結果が出るようにしました。 検索ボタンは Private Sub コマンド9_Click() Dim SQL As String Dim WhereCond As String Dim condName As String Dim condKoumoku1 As String Dim condKoumoku2 As String Dim condKoumoku3 As String WhereCond = "" '名前 If Me!名前.Value <> "" Then condName = "(一覧.名前 like '*" & Me!名前.Value & "*')" WhereCond = WhereCond & " and " & condName End If '項目1 If Me!項目1.Value <> "" Then condKoumoku1 = "(一覧.項目1 like '*" & Me!項目1.Value & "*')" WhereCond = WhereCond & " and " & condKoumoku1 End If : WhereCond = Mid(WhereCond, 6) DoCmd.OpenForm "検索結果フォーム", acNormal, , WhereCond End Sub となっています。 そこで、検索フォームで 項目に検索値を入れた場合、一覧の項目すべての中から検索できるようにするにはどうしたらいいのでしょうか? また、今の状態ですとand検索ですが、or検索するにはどのようにしたらいいでしょうか?

  • Accessの検索フォーム(CLng)で。

    検索フォームの項目は以下の通りです。 ○ AND  ○ OR 名前  [    ] 項目  [    ]▼  [    ]▼  [    ]▼ もとになってるテーブルは ・名前 ・項目1 ・項目2 ・項目3 ・項目4 ・項目5 というようなっています。 (項目1-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!項目1.Value <> "" Then condKoumoku1 = "(T_マスタ.項目1 = " & CLng(Me!項目1.Value) & ")" condKoumoku2 = "(T_マスタ.項目2 = " & CLng(Me!項目1.Value) & ")" condKoumoku3 = "(T_マスタ.項目3 = " & CLng(Me!項目1.Value) & ")" tempCond = tempCond & " OR (" & condKoumoku1 & " OR " & condKoumoku2 & " OR " & condKoumoku3 & ")" End If If tempCond <> "" Then tempCond = Mid(tempCond, 5) WhereCond = WhereCond & tempOper & "(" & tempCond & ")" End If WhereCond = Mid(WhereCond, strCount + 1) DoCmd.OpenForm "F_検索結果_一覧", acNormal, , WhereCond これを実行すると クエリ式 '((OR OR))' の構文エラー:演算子がありません。 と出ます。 どこを訂正すべきでしょうか? Access2000です。

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

    検索フォームの項目は以下の通りです。 ○ 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です。

  • テキスト形式だけど「between a and b」を使うには?

    AccessのVBAで検索するためのコードを作成しています。 とあるフィールドは形式が「テキスト形式」なんですが、 その中で「AからBの間」という検索をしたいんです。 くんでみたコードはこんな感じです。 condData = "(T_テーブル.Data between #" & Me!A.Value & "# and #" & Me!B.Value & "#)" WhereCond = WhereCond & "and" & condData WhereCond = Mid(WhereCond, strCount + 1) DoCmd.OpenForm "F_検索結果", acNormal, , WhereCond ですが実行すると、 実行時エラー'3075': クエリ式 'and(T_テーブル.Data between # A # and # B # )' の構文エラー:演算子がありません。 とでてしまいました。 どこがダメなのでしょうか? よろしくお願いします。

  • 検索フォームで検索するものが決まっているときのかきかた。

    Ac2000です。 T_マスタというテーブルに 名前や所属の課、年度などが入っています。 このTマスタから検索する検索フォームがあります。 検索ボタンがいくつかあり、 年度を検索するようにテキストボックスがあります。 年度テキストボックスにいれた年度で検索しつつ、 押した検索ボタンによって検索する方法はどのようにしたらよいでしょうか? Ex.検索ボタンには所属の課などがかいてあり、「総務」「営業」などどかいてあります。 ソースはこんな感じです。 ------------------------------ Dim SQL As String Dim WhereCond As String Dim condNendo As String '年度 If Me!年度.Value <> "" Then condNendo = "(T_マスタテーブル.年度 = " & CLng(Me!年度.Value) & ")" WhereCond = WhereCond & " AND " & condNendo End If WhereCond = Mid(WhereCond, 6) DoCmd.OpenReport "R_マスタ_一覧", acPreview, , WhereCond End Sub

  • サブフォーム用のテーブルのデータで検索をしてマスタフォームに表示したい。

    Access2000での質問です。 T_マスタ(氏名ID・氏名)・T_サブ(氏名ID・データ年・データ種類)というテーブルから F_マスタ・F_サブというフォームを作成し、 F_マスタの中にサブフォームとしてF_サブを入れています。(氏名IDでリンク) F_検索というフォームを作成し、 データ年・データ種類で検索するようにしました。 この結果を、F_マスタで表示したいのですが、 F_マスタはT_マスタから作成されているため、検索結果が 希望するものではなくなってしまいます。 F_サブでみればきちんと検索されているのですが、 それでは氏名がみれないので。。。 このようなことはできるのでしょうか? F_検索の検索ボタンのコードです。 ------- Private Sub コマンド1_Click() Dim SQL As String Dim WhereCond As String Dim condNendo As String Dim condSyurui As String 'データ年 If Me!データ年.Value <> "" Then condNendo = "(T_サブ.データ年 like '*" & Me!データ年.Value & "*')" WhereCond = WhereCond & " AND " & condNendo End If '種類 If Me!データ種類.Value <> "" Then condSyurui = "(T_サブ.データ種類 like '*" & Me!データ種類.Value & "*')" WhereCond = WhereCond & " AND " & condSyurui End If WhereCond = Mid(WhereCond, 6) DoCmd.OpenForm "F_サブ", acNormal, , WhereCond End Sub ------- *上記の「F_サブ」を[F_マスタ」で開くようにしたいのです。 宜しくお願いします。

  • 「DoCmd.OpenForm」が実行できない(vbaでフォームを開きたい)

    「フォーム1を開く」vbaで行ないたいのですが エラーになってしまいます。 Sub test1() DoCmd.OpenForm , acNormal, フォーム1 End Sub は「変数が定義されていません」と表示され (「変数の宣言を強制する」にチェックを入れています) Sub test2() DoCmd.OpenForm , acNormal, "フォーム1" End Sub は「引数は省略できません」となります。 Sub test1() DoCmd.OpenForm , フォーム1, acNormal End Sub Sub test2() DoCmd.OpenForm , "フォーム1", acNormal End Sub これにしても同じでした。 「OpenForm」をヘルプで調べてみたところ 「expression 」と「FormName」が「 必ず指定します。」でした。 「expression 」がないからだめなのでしょうか? すいません、助けてください。 よろしくお願いします。

専門家に質問してみよう