- ベストアンサー
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が選べるようになっていて、それの結果が入っています。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
補足ありがとうございます。 ひょっとして年齢1フィールドはテキスト型だったりして・・・? だとしたら Age1 = "(Q_メイン.年齢1 between " & "0" & " and " & Me!年齢終了.Value & ")" を Age1 = "(Val(Q_メイン.年齢1) between " & "0" & " and " & Me!年齢終了.Value & ")" にしてみてください。 頑張ってください(^o^)丿
その他の回答 (8)
- mama_mama
- ベストアンサー率30% (129/429)
>If Len(Nz(Me!年齢開始,"")) > 0 Then Age1 = "([Q_メイン].[年齢1] Between 0 And " & Me!年齢終了 & ")" End If >([Q_メイン].[年齢1] Between 0 And 16) となりました。 リテラルが悪いんです。 ([Q_メイン].[年齢1] の部分を変数として認識していません。 後ろの年齢終了のほうはちゃんと16と変換されています。 計算式があってるかは見てません。 If Len(Nz(Me!年齢開始,"")) > 0 Then Age1 = "(" & [Q_メイン].[年齢1] & " Between 0 And " & Me!年齢終了 & ")" End If あともうちょっとかなー。 まだまだかもしれません。 元のクエリーとかソースレコードの指定も心配だし。 WhereCond = Mid(WhereCond, strCount + 1)って何がしたいのですか?引数が一個足りないような。。。
お礼
回答ありがとうございます。 #9の方の方法で無事解決しました! ありがとうございました。
- snoopy64
- ベストアンサー率42% (337/793)
補足ありがとうございます。 年齢フィールドがNullになっているレコードがある、ということですね? でしたら、 Q_メイン.年齢1 を Nz(Q_メイン.年齢1) にしてみてください。Nz関数は「Nullのときは0とする」という機能です。 頑張ってくださいヽ(^。^)ノ
お礼
回答ありがとうございます。 Age1 = "(Q_メイン.年齢1 between " & "0" & " and " & Me!年齢終了.Value & ")" を Age1 = "(Nz(Q_メイン.年齢1) between " & "0" & " and " & Me!年齢終了.Value & ")" としてみましたが、同じエラーに… 指定の仕方が違うのでしょうか?
- snoopy64
- ベストアンサー率42% (337/793)
補足ありがとうございます。 それならDoCmd構文自体は問題なさそうですね。 「F_検索結果」フォームのレコードソースは「Q_メイン」なんですよね・・・? そういえば、「うまくできません」って、具体的にどううまくいかないんですか?
お礼
回答ありがとうございます。 >「F_検索結果」フォームのレコードソースは「Q_メイン」なんですよね・・・? はい、そうです。 >「うまくできません」って、具体的にどううまくいかないんですか? 下にも書きましたが、 ---------- 実行時エラー '2501': OpenForm アクションの実行はキャンセルされました。 ---------- と出て終わってしまうんです。
補足
Age1 = "([Q_メイン].[年齢1] Between 0 And " & Me!年齢終了 & ")" を別項目での検索、ということを試してみようと思い、 Age1 = "([Q_メイン].[年齢] Between 0 And " & Me!年齢終了 & ")" としてみました。 (年齢1とは別に年齢という項目があります。) こうしてみたところちゃんと検索されます!! 計算の仕方が悪いのかと思い、以下のようにかえました。 ※Ageは独自関数 IIf(IsNull([1生年月日]),"",Age([1生年月日])) ↓ ↓ ↓ IIf(IsNull([1生年月日]),"0",Age([1生年月日])) こうするときちんと出ます。 ということは「値が入ってない箇所があるから」ということになるようです。 空白を仮定した書き方はどのようにすればいいのでしょうか?
- snoopy64
- ベストアンサー率42% (337/793)
補足ありがとうございます。 DoCmd.OpenForm "F_検索結果", acNormal, , WhereCond の結果が思わしくないのですよね? この直前で「MsgBox WhereCond」で確認してみてはどうですか? これがおかしければ「MsgBox strCount」で確認と・・・ 一つずつ確認して原因箇所を特定してみましょう。 頑張ってくださいヽ(^。^)ノ
お礼
回答ありがとうございます。 WhereCondは (Q_メイン.年齢1 between 0 and 16) strCount は 4 でした。 …どこかおかしいでしょうか? 特におかしいところが自分にはわからないのですが(><)
- snoopy64
- ベストアンサー率42% (337/793)
直接の回答ではないですが・・・ うまく行かないときは、変数の値をチェックしてみてください。 Age1を作成した直後に「MsgBox Age1」 WhereCondを作成した直後に「MsgBox WhereCond」 デバッグの基本です。 頑張ってくださいヽ(^。^)ノ
お礼
回答ありがとうございます。 Age1は (Q_メイン.年齢1 between 0 and 16) WhereCondは OR (Q_メイン.年齢1 between 0 and 16) と出ました。 これは何か手がかりになるでしょうか?
- Gin_F
- ベストアンサー率63% (286/453)
とりあえず、この部分だけで動作をするか確認してください。 If Len(Nz(Me!年齢開始,"") > 0 Then Age1 = "([Q_メイン].[年齢1] Between 0 And " & Me!年齢終了 & ")" End If
お礼
回答ありがとうございます。 If Len(Nz(Me!年齢開始,"")) > 0 Then Age1 = "([Q_メイン].[年齢1] Between 0 And " & Me!年齢終了 & ")" End If に MsgBox Age1 を付け加え実行したところ、 ([Q_メイン].[年齢1] Between 0 And 16) となりました。
- Gin_F
- ベストアンサー率63% (286/453)
http://okweb.jp/kotaeru.php3?q=1049726 こちらの続きですね。 OR( ( (Q_メイン.年齢1 >= 10 and <= 16) OR (Q_メイン.年齢2 >= 10 and <= 16) ) ) OR (Q_メイン.年齢1 >= 10 and <= 16) OR (Q_メイン.年齢2 >= 10 and <= 16) )) 括弧の数もあっていませんし、先頭の OR も余計ですね。 同じ条件も表示されてますが。。 あと、条件式もおかしいです。 フィールド名 >= 10 And フィールド名 <=16 のようにするか、 フィールド名 Between 10 And 16 のようにしてください。
お礼
回答ありがとうございます。 >括弧の数もあっていませんし、先頭の OR も余計ですね。 Age1 = "(Q_メイン.年齢1 >= '0' and '& <=' & Me!年齢終了.Value )" こういうことでしょうか? ほかの箇所のフィールドを検索する際、まったく同じ構文で使えているので、間違いないと思っていたんですが。 between * and * でもだめです。 >= * And <= * はかえさせていただきました。
補足
現在、この状態です。 '年齢 If Me!年齢開始.Value <> "" Then Age1 = "(Q_メイン.年齢1 between " & "0" & " and " & Me!年齢終了.Value & ")" WhereCond = WhereCond & tempOper & Age1 End If WhereCond = Mid(WhereCond, strCount + 1) とすると、 実行時エラー'2501': OpenForm アクションの実行はキャンセルされました。 となります。
- mama_mama
- ベストアンサー率30% (129/429)
それぞれの形式(数字、日付、テキスト)をそろえてください。 日付なら、#2004/10/21#となるように#で囲んでくださいね。文字列なら、まぎらわしい " でなく ' を使うほうがわかりやすいですよ。 誕生日から年齢を出す計算式がどういうものかわかりませんが、もしかしたら、結果が文字列になっているのかもしれません。 年齢開始は""でくくっているなら、こちらが文字列になっているのかもしれませんね。 VBAに入っているスペースが全角の空白? VBAに半角のスペースが足りない? and と & のせいで動かなかったことがあります。 (どっちが悪いのか忘れましたが) 一度WhereCondに変数を使わない式を入れてみて、動いてから、その式を変数を使う式に書き換えてみるといいですよ。 いろいろ試してみてください。
お礼
回答ありがとうございます。 >誕生日から年齢を出す計算式がどういうものかわかりませんが、もしかしたら、結果が文字列になっているのかもしれません。 クエリで計算した結果の形式はどこで見たら…? 今まで特に気にしてなかったもので。 Age1 = "(Q_メイン.年齢 >= " & "0" & " and <= " & Me!年齢終了.Value & ")" を Age1 = "(Q_メイン.年齢 >= ' & '0' & ' and <= ' & Me!年齢終了.Value & ')" や Age1 = "(Q_メイン.年齢 >= ' & '0' & ' & <= ' & Me!年齢終了.Value & ')" にしてみましたが、同じでした。
お礼
回答ありがとうございます。 無事解決しました! val()がポイントだったんですね。 ありがとうございました~☆★