アプリ版:「スタンプのみでお礼する」機能のリリースについて

クエリーで計算して出した結果をもとにフォームを使って検索をしたいのですが、うまくできません。

クエリーの計算式は誕生日から年齢を出すものが入っています。

フォームのボタンに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が選べるようになっていて、それの結果が入っています。

A 回答 (9件)

補足ありがとうございます。


ひょっとして年齢1フィールドはテキスト型だったりして・・・?
だとしたら
Age1 = "(Q_メイン.年齢1 between " & "0" & " and " & Me!年齢終了.Value & ")"

Age1 = "(Val(Q_メイン.年齢1) between " & "0" & " and " & Me!年齢終了.Value & ")"
にしてみてください。
頑張ってください(^o^)丿
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
無事解決しました!
val()がポイントだったんですね。
ありがとうございました~☆★

お礼日時:2004/10/25 09:00

>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)って何がしたいのですか?引数が一個足りないような。。。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
#9の方の方法で無事解決しました!
ありがとうございました。

お礼日時:2004/10/25 08:59

補足ありがとうございます。


年齢フィールドがNullになっているレコードがある、ということですね?
でしたら、
Q_メイン.年齢1

Nz(Q_メイン.年齢1)
にしてみてください。Nz関数は「Nullのときは0とする」という機能です。
頑張ってくださいヽ(^。^)ノ
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

Age1 = "(Q_メイン.年齢1 between " & "0" & " and " & Me!年齢終了.Value & ")"

Age1 = "(Nz(Q_メイン.年齢1) between " & "0" & " and " & Me!年齢終了.Value & ")"
としてみましたが、同じエラーに…
指定の仕方が違うのでしょうか?

お礼日時:2004/10/22 16:47

補足ありがとうございます。


それならDoCmd構文自体は問題なさそうですね。
「F_検索結果」フォームのレコードソースは「Q_メイン」なんですよね・・・?
そういえば、「うまくできません」って、具体的にどううまくいかないんですか?

この回答への補足

  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生年月日]))
こうするときちんと出ます。
ということは「値が入ってない箇所があるから」ということになるようです。

空白を仮定した書き方はどのようにすればいいのでしょうか?

補足日時:2004/10/22 16:06
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>「F_検索結果」フォームのレコードソースは「Q_メイン」なんですよね・・・?

はい、そうです。

>「うまくできません」って、具体的にどううまくいかないんですか?

下にも書きましたが、

----------
実行時エラー '2501':

OpenForm アクションの実行はキャンセルされました。
----------
と出て終わってしまうんです。

お礼日時:2004/10/22 15:06

補足ありがとうございます。


DoCmd.OpenForm "F_検索結果", acNormal, , WhereCond
の結果が思わしくないのですよね?
この直前で「MsgBox WhereCond」で確認してみてはどうですか?
これがおかしければ「MsgBox strCount」で確認と・・・
一つずつ確認して原因箇所を特定してみましょう。
頑張ってくださいヽ(^。^)ノ
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

WhereCondは
(Q_メイン.年齢1 between 0 and 16)
strCount は
4
でした。

…どこかおかしいでしょうか?
特におかしいところが自分にはわからないのですが(><)

お礼日時:2004/10/22 14:15

直接の回答ではないですが・・・


うまく行かないときは、変数の値をチェックしてみてください。
Age1を作成した直後に「MsgBox Age1」
WhereCondを作成した直後に「MsgBox WhereCond」
デバッグの基本です。
頑張ってくださいヽ(^。^)ノ
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

Age1は
(Q_メイン.年齢1 between 0 and 16)
WhereCondは
OR (Q_メイン.年齢1 between 0 and 16)
と出ました。

これは何か手がかりになるでしょうか?

お礼日時:2004/10/22 13:11

とりあえず、この部分だけで動作をするか確認してください。



If Len(Nz(Me!年齢開始,"") > 0 Then
  Age1 = "([Q_メイン].[年齢1] Between 0 And " & Me!年齢終了 & ")"
End If
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

If Len(Nz(Me!年齢開始,"")) > 0 Then
  Age1 = "([Q_メイン].[年齢1] Between 0 And " & Me!年齢終了 & ")"
End If


MsgBox Age1

を付け加え実行したところ、

([Q_メイン].[年齢1] Between 0 And 16)
となりました。

お礼日時:2004/10/22 13:07

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
のようにしてください。

この回答への補足

現在、この状態です。

'年齢
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 アクションの実行はキャンセルされました。

となります。

補足日時:2004/10/22 11:35
    • good
    • 0
この回答へのお礼

回答ありがとうございます。


>括弧の数もあっていませんし、先頭の OR も余計ですね。
Age1 = "(Q_メイン.年齢1 >= '0' and '& <=' & Me!年齢終了.Value )"
こういうことでしょうか?

ほかの箇所のフィールドを検索する際、まったく同じ構文で使えているので、間違いないと思っていたんですが。
between * and *
でもだめです。

>= * And <= *
はかえさせていただきました。

お礼日時:2004/10/22 09:33

それぞれの形式(数字、日付、テキスト)をそろえてください。



日付なら、#2004/10/21#となるように#で囲んでくださいね。文字列なら、まぎらわしい " でなく ' を使うほうがわかりやすいですよ。

誕生日から年齢を出す計算式がどういうものかわかりませんが、もしかしたら、結果が文字列になっているのかもしれません。

年齢開始は""でくくっているなら、こちらが文字列になっているのかもしれませんね。

VBAに入っているスペースが全角の空白?
VBAに半角のスペースが足りない?
and と & のせいで動かなかったことがあります。
(どっちが悪いのか忘れましたが)

一度WhereCondに変数を使わない式を入れてみて、動いてから、その式を変数を使う式に書き換えてみるといいですよ。

いろいろ試してみてください。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

>誕生日から年齢を出す計算式がどういうものかわかりませんが、もしかしたら、結果が文字列になっているのかもしれません。

クエリで計算した結果の形式はどこで見たら…?
今まで特に気にしてなかったもので。


Age1 = "(Q_メイン.年齢 >= " & "0" & " and <= " & Me!年齢終了.Value & ")"

Age1 = "(Q_メイン.年齢 >= ' & '0' & ' and <= ' & Me!年齢終了.Value & ')"

Age1 = "(Q_メイン.年齢 >= ' & '0' & ' & <= ' & Me!年齢終了.Value & ')"
にしてみましたが、同じでした。

お礼日時:2004/10/22 09:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!