Access VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


267 / 2272 ツリー ←次へ | 前へ→

【12321】Access VBA OpenFormの抽出条件 kuma 13/5/28(火) 9:24 質問[未読]
【12322】Re:Access VBA OpenFormの抽出条件 かるびの 13/5/29(水) 2:03 回答[未読]
【12324】Re:Access VBA OpenFormの抽出条件 hatena 13/5/29(水) 15:00 回答[未読]
【12327】Re:Access VBA OpenFormの抽出条件 kuma 13/5/30(木) 13:08 お礼[未読]
【12328】Re:Access VBA OpenFormの抽出条件 hatena 13/5/30(木) 13:33 回答[未読]
【12329】Re:Access VBA OpenFormの抽出条件 kuma 13/5/30(木) 15:45 お礼[未読]
【12330】Re:Access VBA OpenFormの抽出条件 hatena 13/5/30(木) 16:20 回答[未読]

【12321】Access VBA OpenFormの抽出条件
質問  kuma  - 13/5/28(火) 9:24 -

引用なし
パスワード
   初めて利用します。
Access2010を利用しています。

DoCmd.OpenFormの抽出条件が上手く動かなくて困っています。

【テーブル構成】
T顧客
 ・顧客NO(主キー)
 ・氏名
T中止
 ・中止NO(主キー)
 ・顧客NO(リレーションシップ有り)
 ・中止開始(日付)
 ・中止終了(日付)

【フォーム作成】
フォーム F顧客
フォーム F中止
フォーム 開始

フォーム開始にオプショングループで「中止含む」「中止除く」「中止のみ」を作成してあります。
中止含むの場合は以下のプログラムです

DoCmd.OpenForm "F顧客"

単純なので全顧客レコードを引っ張ってくれますが、ここで「中止除く」を選んだ場合に、
「テーブルT中止の中止終了日が空白の人は抽出条件で弾く」ということをしたいです。
T中止では顧客NOの重複があります。
(例えばAさん1回目中止開始2012/12/01 中止終了日2013/01/15
    Aさん2回目中止開始2013/04/01 中止終了日 (空白というかNull))

作ったVBAは下の通りですが…上手く動きません。

DoCmd.OpenForm "F顧客", acNormal, , "NZ([T中止].[中止終了]) <> """")"

どのようにしたらいいでしょうか。

【12322】Re:Access VBA OpenFormの抽出条件
回答  かるびの  - 13/5/29(水) 2:03 -

引用なし
パスワード
   >DoCmd.OpenForm "F顧客", acNormal, , "NZ([T中止].[中止終了]) <> """")"

 まず、第4引数の一番後の閉じ括弧ですが、
これに対応する開き括弧はどこにあるのでしょうか。

 次に、第4引数の「[T中止].[中止終了]」ですが、
確かに、ヘルプを見ると、
「有効な SQL WHERE 句を文字列式で指定します。」と書いてあるし、
「NZ([T中止].[中止終了]) <> """"」というのは、
SQL文のWHERE句の書き方として間違っていないんですね。
 でも、ここはレコードソースのフィールド名を指定すべきです。
 レコードソースのフィールド名には、ほかに同名のフィールド名がなければ、
テーブル名指定の部分は入りません。   

 それから、Nz関数の第2引数はきちんと指定してあげた方がいいと思います。
 第2引数を指定せずにNz関数を適用した場合、数値型なら0が返るし、
テキスト型なら長さ0の文字列が返りますが、
日付型のときに何が返ってくるかちょっと不安だからです。
 また、SQL文の中で、アクセスの関数を、引数を省略して使おうとすると、
SQLがその関数を解釈できないことがあります。

【12324】Re:Access VBA OpenFormの抽出条件
回答  hatena  - 13/5/29(水) 15:00 -

引用なし
パスワード
   ▼kuma さん:
>単純なので全顧客レコードを引っ張ってくれますが、ここで「中止除く」を選んだ場合に、
>「テーブルT中止の中止終了日が空白の人は抽出条件で弾く」ということをしたいです。
>T中止では顧客NOの重複があります。
>(例えばAさん1回目中止開始2012/12/01 中止終了日2013/01/15
>    Aさん2回目中止開始2013/04/01 中止終了日 (空白というかNull))
>
>作ったVBAは下の通りですが…上手く動きません。
>
>DoCmd.OpenForm "F顧客", acNormal, , "NZ([T中止].[中止終了]) <> """")"

かるびのさんも指摘しているように、) が余分ですね。

"NZ([T中止].[中止終了]) <> """""

これはクエリのWHERE句で
NZ([T中止].[中止終了]) <> ""
と設定したのと同じ事になります。

ここで、中止終了 は日付/時刻型ですよね。
"" は空文字列でテキスト型になります。
これではデータ型違いですね。
NZでの変換と暗黙の型変換で、動作しますが、ちょっと無駄ですね。

Null を除く という条件式は正しくは、

[中止終了] Is Not Null

です。

DoCmd.OpenForm "F顧客", acNormal, , "[中止終了] Is Not Null"

【12327】Re:Access VBA OpenFormの抽出条件
お礼  kuma  - 13/5/30(木) 13:08 -

引用なし
パスワード
   かるびのさん、hatenaさん
返信ありがとうございました。

どうにも上手くいきませんでした。

あがきで、NZ関数に第二引数に1111/11/11という日付を入力しましたが
「パラメータの入力」というインプットボックスが出てきてしまいます。

コマンドはこれです。
DoCmd.OpenForm "F顧客", acNormal, , "NZ([T中止].[中止終了],'#1111/11/11#') <> ('#1111/11/11#')"

変に難しい事考えないで、別クエリ作って、別フォームを呼び出すようにした方が
早いでしょうか……

【12328】Re:Access VBA OpenFormの抽出条件
回答  hatena  - 13/5/30(木) 13:33 -

引用なし
パスワード
   > DoCmd.OpenForm "F顧客", acNormal, , "NZ([T中止].[中止終了],'#1111/11/11#') <> ('#1111/11/11#')"

' と () が余分です。' で囲むと文字列になっちゃいます。あと全角空白がありますが、半角空白にしてください。

DoCmd.OpenForm "F顧客", acNormal, , "NZ([T中止].[中止終了],#1111/11/11#) <> #1111/11/11#"

繰り返しになりますが、

DoCmd.OpenForm "F顧客", acNormal, , "[T中止].[中止終了] Is Not Null"

とするのがペスト解だと思います。

> 「パラメータの入力」というインプットボックスが出てきてしまいます。

その時のボックスの上の標題は何になってますか。
その標題のものが見つからないということですので、それの記述ミスだと思いますが。

【12329】Re:Access VBA OpenFormの抽出条件
お礼  kuma  - 13/5/30(木) 15:45 -

引用なし
パスワード
   返信ありがとうございます。

>> 「パラメータの入力」というインプットボックスが出てきてしまいます。

>その時のボックスの上の標題は何になってますか。
>その標題のものが見つからないということですので、それの記述ミスだと思いますが。

インプットボックスには   [T中止].[中止終了日]   と出ています。
T中止テーブルのテーブル名と項目名を見直して、
コピペでVBAに書き込みましたが、

・DoCmd.OpenForm "F顧客", acNormal, , "NZ([T中止].[中止終了日],#1111/11/11#) <> #1111/11/11#"

・DoCmd.OpenForm "F顧客", acNormal, , "[T中止].[中止終了日] Is Not Null"

のどちらでも パラメータの入力 [T中止].[中止終了日]
のインプットボックスが出てしまいます。
(念のためVBA上から[T中止]を外して実行してみましたが、
 ボックスの文字が パラメータの入力 [中止終了日]  になっただけでした)

【12330】Re:Access VBA OpenFormの抽出条件
回答  hatena  - 13/5/30(木) 16:20 -

引用なし
パスワード
   ▼kuma さん:
>T中止テーブルのテーブル名と項目名を見直して、
>コピペでVBAに書き込みましたが、
>
>・DoCmd.OpenForm "F顧客", acNormal, , "NZ([T中止].[中止終了日],#1111/11/11#) <> #1111/11/11#"
>
>・DoCmd.OpenForm "F顧客", acNormal, , "[T中止].[中止終了日] Is Not Null"
>
>のどちらでも パラメータの入力 [T中止].[中止終了日]
>のインプットボックスが出てしまいます。

ひょっとすると、F顧客 のレコードソースは、T顧客 で、中止終了日 フィールドは含まれていないということかな?

で、対応する T中止 の 中止終了日 に Null があったらその顧客は抽出しないということかな?


DoCmd.OpenForm "F顧客", acNormal, , "DLookup('顧客NO','T中止', '中止終了日 Is Not Null AND 顧客NO=' & [顧客NO]) Is Null"

これでどうだろう。サンプルで確認していないのでミスがあるかも。

考え方は、
DLookup で T中止から顧客NOが一致して中止終了日がNUllのレコードを検索→対象レコードがないとき NUll→結果がNullのレコートを抽出

267 / 2272 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
1078191
(SS)C-BOARD v3.8 is Free