Access VBA質問箱 IV

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

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


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

【12728】複数条件での抽出 木葉 15/3/13(金) 15:40 質問[未読]
【12729】Re:複数条件での抽出 木葉 15/3/13(金) 17:10 発言[未読]
【12730】Re:複数条件での抽出 かるびの 15/3/14(土) 0:46 回答[未読]
【12732】Re:複数条件での抽出 木葉 15/3/16(月) 16:34 発言[未読]
【12736】Re:複数条件での抽出 木葉 15/3/17(火) 16:25 質問[未読]
【12739】Re:複数条件での抽出 かるびの 15/3/18(水) 1:15 回答[未読]
【12740】Re:複数条件での抽出 木葉 15/3/18(水) 9:56 発言[未読]
【12742】Re:複数条件での抽出 木葉 15/3/18(水) 14:02 質問[未読]
【12744】Re:複数条件での抽出 かるびの 15/3/19(木) 0:52 回答[未読]
【12745】Re:複数条件での抽出 木葉 15/3/19(木) 9:54 発言[未読]
【12746】Re:複数条件での抽出 木葉 15/3/19(木) 10:02 お礼[未読]
【12747】Re:複数条件での抽出 かるびの 15/3/21(土) 0:57 回答[未読]
【12752】Re:複数条件での抽出 木葉 15/3/23(月) 14:33 質問[未読]
【12755】Re:複数条件での抽出 かるびの 15/3/24(火) 3:28 回答[未読]
【12757】Re:複数条件での抽出 木葉 15/3/24(火) 11:14 発言[未読]
【12759】Re:複数条件での抽出 木葉 15/3/24(火) 16:00 質問[未読]
【12763】Re:複数条件での抽出 かるびの 15/3/25(水) 0:54 回答[未読]
【12767】Re:複数条件での抽出 木葉 15/3/25(水) 11:19 質問[未読]
【12768】Re:複数条件での抽出 木葉 15/3/25(水) 11:24 発言[未読]
【12771】Re:複数条件での抽出 木葉 15/3/25(水) 15:13 質問[未読]
【12772】Re:複数条件での抽出 hatena 15/3/25(水) 16:04 回答[未読]
【12774】Re:複数条件での抽出 木葉 15/3/25(水) 17:21 お礼[未読]

【12728】複数条件での抽出
質問  木葉  - 15/3/13(金) 15:40 -

引用なし
パスワード
   【Win8/access2013】

こんにちは。初めてこちらで質問させていただきます。
宜しくお願いします。

アクセスの能力としては、ようやく基礎の操作を覚えたぐらいの小鹿レベルです。
お手数ですが、なるべく簡易な語彙で教えていただけると助かります。


取引先ごとの運賃を管理しております。

帳票型フォームにて複数条件での絞り込みができたらと考えております。


配置については以下の通りです。

○フォームヘッダー
検索する内容を入力するためのテキストボックス(複数)と、
その内容を検索するためのボタン(名前:cmdFilter、標題:検索)を設置しました。

検索用のテキストボックスは以下の7つです。
・cmb取引先(これはコンボボックスで取引先を選択できるようにしています)
・txt発地都道府県
・txt発地(市町村)
・txt着地都道府県
・txt着地(市町村)
・txt日付(開始)
・txt日付(終了)
※日付については、(開始)から(終了)までの間のものを抽出します。
※地名の部分4つはあいまい検索にしたいです。
※()内はテキストボックスの「名前」には含まれていません。

○詳細
ヘッダーと同じもの(「名前」はcmb、txtを省いたものにしています)に加え、
整列番号、取引先コード、重量、金額、備考の列があります。


手順としては、ヘッダーのテキストボックスに必要な条件を入力し、
検索ボタンを押すと詳細にて抽出が行われる、といった具合です。

未入力の場合は、その部分は無視した状態で抽出します。


そこで、まずはステップを踏んでいこうと思いまして、
1.発地都道府県だけのフィルター設定をする
2.日付のフィルターを設定する
3.一連の流れを作る

と考えていたのですが、1.から躓いてしまい…

お恥ずかしい限りですが、ご指導いただければと思います。


1.で試してみたコードは以下の通りですが、全く反応なしでした…

Private Sub cmdFilter_Click()
  Dim strFilter As String

  
  If Not IsNull(Me.txt発地都道府県) Then
    strFilter = strFilter & " AND 発地都道府県 Like '*" & Me.txt発地都道府県 & "*'"
  End If

End Sub

【12729】Re:複数条件での抽出
発言  木葉  - 15/3/13(金) 17:10 -

引用なし
パスワード
   Me.FilterOn = True

の文を追加したらフィルター自体はかかりましたが、
何も抽出されませんでした…

土日は返信しずらい環境になりますので、お返事が遅くなると思います。
ご了承くださいませ

【12730】Re:複数条件での抽出
回答  かるびの  - 15/3/14(土) 0:46 -

引用なし
パスワード
    本題ではありませんが、疑問点を。
>>・txt日付(開始)
>>・txt日付(終了)

>>※()内はテキストボックスの「名前」には含まれていません。

 開始の日付を入力するテキストボックスの名前
及び終了の日付を入力するテキストボックスの名前はそれぞれ何なのでしょうか。
 上記の説明からすると、どちらも「txt日付」となってしまいますが、
コントロールに同じ名前が付けられるのは許容されないはずです。


 さて、本題です。
>>1.で試してみたコードは以下の通りですが、全く反応なしでした…
>>
>>Private Sub cmdFilter_Click()
>>  Dim strFilter As String
>>  
>>  If Not IsNull(Me.txt発地都道府県) Then
>>    strFilter = strFilter & " AND 発地都道府県 Like '*" & Me.txt発地都道府県 & "*'"
>>  End If
>>
>>End Sub

 反応がないのは、当たり前です。 
 Filterプロパティには何も値が設定されていないからです。
 「Me.Filter = ××」というコードを追加してください。  


>Me.FilterOn = True
>
>の文を追加したらフィルター自体はかかりましたが、
>何も抽出されませんでした…

 これも当然の結果です。
 Filterプロパティには何も値が設定されていないからです。


 ところで、
>>  If Not IsNull(Me.txt発地都道府県) Then
>>    strFilter = strFilter & " AND 発地都道府県 Like '*" & Me.txt発地都道府県 & "*'"
>>  End If
 このstrFilterをそのままFilterプロパティに代入しても、エラーになりますよ。
 「 AND 」が余計です。
 複数条件を積み重ねていく場合は、この「 AND 」は不可欠なのですが、
先頭の「 AND 」は取り除く必要があります。
 その方法は考えてありますか。

【12732】Re:複数条件での抽出
発言  木葉  - 15/3/16(月) 16:34 -

引用なし
パスワード
   ▼かるびの様:


お返事ありがとうございます。

疑問点ですが、確認しましたところ、
それぞれ「開始日」「終了日」となっていました。

ご指摘ありがとうございます。


本題についてですが、
あまりに自分が勉強不足であることが身に染みてわかってきましたので、
今一度勉強しなおしてきます…
せめて1.の分だけでも自力でやってみようと思います。

また質問ができ次第こちらに再度させていただきますので、
お時間ありましたらご回答いただけると嬉しいです。


> このstrFilterをそのままFilterプロパティに代入しても、エラーになりますよ。
>  「 AND 」が余計です。
>  複数条件を積み重ねていく場合は、この「 AND 」は不可欠なのですが、
> 先頭の「 AND 」は取り除く必要があります。

以上についても、今の知識では理解し難いため、今一度勉強させていただきます。

ご丁寧に回答いただき、ありがとうございました^^

【12736】Re:複数条件での抽出
質問  木葉  - 15/3/17(火) 16:25 -

引用なし
パスワード
   こんにちは
遅くなりまして…


おおまかにですが、基礎を勉強しなおしまして
1.に成功した次第です。

現在のコードは以下の通りです。

Private Sub cmdFilter_Click()

If Not IsNull(txt発地都道府県) Then
Me.Filter = "発地都道府県 Like '*" & txt発地都道府県.Value & "*'"
End If

End Sub

ここで疑問なのですが、
「txt発地都道府県」に何か文字(仮に東京とします)を入れて、検索ボタンを押しました。
ここまでは正常に作動しています。

次にフィールター解除(メニューのボタンから)を一度押し、
「txt発地都道府県」に入れている文字(東京)を消してそのまま検索ボタンを押すと
「東京」が抽出された状態になるのですが、
この原因は何かご存知でしょうか?

勝手な憶測ですが、一度VBAを作動させたら設定は内部的に記憶されたまま、フィルターを解除しても残り続けるとか…


希望としては、フィルター解除→テキストボックス内の文字を消去→再度検索ボタンを押すときには前に設定したものもクリアにしたいのですが、そういったことは可能でしょうか?

【12739】Re:複数条件での抽出
回答  かるびの  - 15/3/18(水) 1:15 -

引用なし
パスワード
   >次にフィールター解除(メニューのボタンから)を一度押し、
>「txt発地都道府県」に入れている文字(東京)を消してそのまま検索ボタンを押すと
>「東京」が抽出された状態になるのですが、
>この原因は何かご存知でしょうか?

 フィルタ解除のコマンドボタン・クリックのイベントでは、どのような処理をしていますか。
 おそらく、「Me.FilterOn = False」だけではないかと思います。

 1回目の検索で東京を検索すると、Filterプロパティには、「発地都道府県 Like '*東京*'」
という文字列が設定されます。
 この設定は、フォームを閉じるまで維持されます。
 txt発地都道府県の値をNullに変えたからといって、
Filterプロパティが自動的に再設定されることはありません。

 なので、Filterプロパティに新しい値を設定することなく、FilterOnプロパティをTrueにすれば、
Filterプロパティに設定されている「発地都道府県 Like '*東京*'」という条件式で
フィルタがかかるわけです。

 対策ですが、
フィルタ解除か、txt発地都道府県内の文字を消去したタイミングで
Filterプロパティに長さ0の文字列を設定すればいいでしょう。

【12740】Re:複数条件での抽出
発言  木葉  - 15/3/18(水) 9:56 -

引用なし
パスワード
   かるびの様
お返事ありがとうございます。

なるほど!そういうことでしたか!

>フィルタ解除のコマンドボタン・クリックのイベントでは、どのような処理をしていますか。

今のところは処理どころかボタンも作っておらず、
リボンのホームからフィルター解除を行っている次第です。

これではプロパティの設定は変わらないのですね…

ということは新たにフィルター解除用にコマンドボタンを作った方が
いいですよね。

>対策ですが、
>フィルタ解除か、txt発地都道府県内の文字を消去したタイミングで
>Filterプロパティに長さ0の文字列を設定すればいいでしょう。


一度作ってみます!
ご丁寧に説明していただきまして、ありがとうございます!

【12742】Re:複数条件での抽出
質問  木葉  - 15/3/18(水) 14:02 -

引用なし
パスワード
   解除ボタン、作れました(他のサイトから引っ張ってきただけですが)。
ちょっと本題から脱線(?)したお話までお付き合いいただき、ありがとうございます!

滞っている最初に質問した内容に戻ります…。

それぞれの抽出するコード自体は書ききることができました。
今はまだそれぞれが孤立している状態で、
ここから条件をつなげていく方法が今ひとつわかりません…。

最初のご回答でおっしゃられていた、
> このstrFilterをそのままFilterプロパティに代入しても、エラーになりますよ。
> 「 AND 」が余計です。
>  複数条件を積み重ねていく場合は、この「 AND 」は不可欠なのですが、
> 先頭の「 AND 」は取り除く必要があります。

このことも、未だあまり理解できていません(ごめんなさい)。

分からないことだらけで申し訳ないのですが、
もうしばらくお付き合いいただけると嬉しいです。
宜しくお願いします。

【12744】Re:複数条件での抽出
回答  かるびの E-MAIL  - 15/3/19(木) 0:52 -

引用なし
パスワード
   >それぞれの抽出するコード自体は書ききることができました。
>今はまだそれぞれが孤立している状態で、
>ここから条件をつなげていく方法が今ひとつわかりません…。

 各条件式をAND演算子やOR演算子でつないでいきます。
 例えば、
  氏名 Like "山田*" AND (生年月日 >= #1980/02/01# OR 体重 < 75)
です。
 こういう文字列を作り、この文字列をFilterプロパティに設定します。


 次に、このような文字列を作るVBAのコードをどうするかですが、
 No.12728の質問にあった
>>>strFilter = strFilter & " AND 発地都道府県 Like '*" & Me.txt発地都道府県 & "*'"
というコードは、重要なテクニックが使われているコードです。

 例えば、次のコードを実行したら、strFilterにはどんな文字列が格納されることになるか
イメージできますか。
   strFilter = strFilter & " AND 発地都道府県 Like '*東京*'"
   strFilter = strFilter & " AND 発地都道府県 Like '*神奈川*'"
   strFilter = strFilter & " AND 発地都道府県 Like '*静岡*'"

 答えは、
" AND 発地都道府県 Like '*東京*' AND 発地都道府県 Like '*神奈川*' AND 発地都道府県 Like '*静岡*'" 
という文字列ですね。これでは見づらいので、整形すると、
   " AND 発地都道府県 Like '*東京*'
    AND 発地都道府県 Like '*神奈川*'
    AND 発地都道府県 Like '*静岡*'" 
ですね。
 2行目と3行目にうまくAND演算子が入っています。

 つまり、
>>>strFilter = strFilter & " AND 発地都道府県 Like '*" & Me.txt発地都道府県 & "*'"
のコードは、上例の2行目と3行目にうまくAND演算子が入れるための
重要なテクニックです。


 ただ、
   " AND 発地都道府県 Like '*東京*'
    AND 発地都道府県 Like '*神奈川*'
    AND 発地都道府県 Like '*静岡*'" 
という文字列をFilterプロパティに代入すると、エラーになります。
 原因は、先頭にある「 AND 」です。
 先頭の「 AND 」だけを取り除く必要があります。

 ここも定番のテクニックがあります。
 Mid関数を使用します。
 Mid関数を使って、
   " AND 発地都道府県 Like '*東京*'
    AND 発地都道府県 Like '*神奈川*'
    AND 発地都道府県 Like '*静岡*'" 
という文字列から6字目以降を取り出します。
 そうすると、 
   "発地都道府県 Like '*東京*'
    AND 発地都道府県 Like '*神奈川*'
    AND 発地都道府県 Like '*静岡*'" 
という文字列を取得できます。
 

【12745】Re:複数条件での抽出
発言  木葉  - 15/3/19(木) 9:54 -

引用なし
パスワード
   ▼かるびの様:

お返事ありがとうございます。

なるほど!
ご丁寧に説明していただきありがとうございます!


最初にご回答いただいた時の質問の解説も合わせて、ありがとうございます。


全体を繋げることはできました!

>Mid関数を使用します。
いろんなサイトを見て回っていたのですが、もしかするとこれは、
Me.Filter = Mid(strFilter, 6)

でしょうか?
複数条件での抽出を解説しているサイトでは大体上の記述があったので、
「これはなんだろう?」と不思議に思っていました。

先頭にある AND を除くためでしたか

【12746】Re:複数条件での抽出
お礼  木葉  - 15/3/19(木) 10:02 -

引用なし
パスワード
   ひとまず完成いたしましたのでコードを載せておきます


Private Sub cmdFilter_Click()

Dim strFilter As String

If Not IsNull(cmb取引先) Then
strFilter = " AND " & "取引先コード Like '" & cmb取引先.Value & "'"
 End If

If Not IsNull(txt発地都道府県) Then
strFilter = strFilter & " AND 発地都道府県 Like '*" & txt発地都道府県.Value & "*'"
End If

If Not IsNull(txt発地) Then
strFilter = strFilter & " AND 発地 Like '*" & txt発地.Value & "*'"
End If

If Not IsNull(txt着地都道府県) Then
strFilter = strFilter & " AND 着地都道府県 Like '*" & txt着地都道府県.Value & "*'"
End If

If Not IsNull(txt着地) Then
strFilter = strFilter & " AND 着地 Like '*" & txt着地.Value & "*'"
End If

If Not IsNull(txt開始日) Then
strFilter = strFilter & " AND 日付 >= #" & txt開始日.Value & "#"
End If

If Not IsNull(txt終了日) Then
strFilter = strFilter & " AND 日付 <= #" & txt終了日.Value & "#"
End If

  Me.Filter = Mid(strFilter, 6)

    Me.FilterOn = True

End Sub

いかがでしょうか?

動作は完全に私の希望していたものでした!

もしお時間ありましたら、不備や過不足などあればご指摘いただきたいと思います。

【12747】Re:複数条件での抽出
回答  かるびの  - 15/3/21(土) 0:57 -

引用なし
パスワード
    些細な点をいくつか。

>If Not IsNull(cmb取引先) Then
 cmb取引先というコンボボックス名ですが、ハンガリアン記法と呼ばれる命名法ですね。
 これは、変数名やコントロール名に
変数のデータ型を示す接頭語やコントロールの種類を示す接頭語を付ける命名法です。
 コンボボックスの接頭語ですが、「cbo」の方がいいと思います。
 「cmb」だと、コマンドボタンを意味する「cmd」と見間違えやすいからです。
 ま、趣味の問題だから、どっちでもいいんですけどね。
 

>If Not IsNull(txt発地都道府県) Then
 Nullの場合だけを除外するのでいいのかなあ。
 txt発地都道府県の値が長さ0の文字列である場合にどうなるか考えてみてください。
 
 長さ0の文字列の場合にも対応しようというのであれば、Nz関数が使えると思います。

 もっとも、手入力では長さ0の文字列をテキストボックスには入力できないので、
そこまで心配する必要はないかもしれません。
 

 それから、「.Value」は省略しない方がいいと思います。
 最近のエクセルVBAについての掲示板を見ていると、このような指摘をときどき見かけます。
 省略すると、その分、コンピュータが補ってくれるわけですが、
コンピュータ内部で補うための処理が必要になるので、その分コードの実行が遅くなるらしいです。


>If Not IsNull(txt発地都道府県) Then
>strFilter = strFilter & " AND 発地都道府県 Like '*" & txt発地都道府県.Value & "*'"
>End If
 エクセルVBAの本に書いてあったのですが、
オブジェクトの参照というのは、VBAコードの中では時間がかかる処理なのだそうです。
 だから、オブジェクトの参照というのは、回数を減らした方がいいそうです。
 これがアクセスの場合にあてはまるかどうかわからないのですが、
同じVBAなので、多分アクセスの場合にもあてはまるのだろうと思います。

 上記コードでは、「If Not IsNull(txt発地都道府県)」でtxt発地都道府県を1回参照し、
「strFilter = strFilter & " AND 発地都道府県 Like '*" & txt発地都道府県.Value & "*'"」
でtxt発地都道府県をもう1回参照し、
結局計2回txt発地都道府県を参照することになります。
 txt発地都道府県の値を変数に受けるか、又はWithステートメントを使えば、
テキストボックスを参照する回数を1回にできます。

 ただし、使う変数を増やすと、その分のメモリー領域を要することになるため、
コードが遅くなると言われています。

 ちなみに私は、無駄に多くの変数を使っています。
 その方がコード内容を読み返したときに理解しやすいし、
デバッグのときにコードが返す値を確認しやすいからです。


>If Not IsNull(txt開始日) Then
 例えば、txt開始日の値が「2015/13/32」だとしたら、どうなるか考えてみてください。

 Nullじゃないから、このIf文は通ります。
 そうすると、この値を使った条件式がstrFilterに代入されます。
 でも、この値は日付ではないので、Filterプロパティへの代入ででエラーになります。

 IsDate関数を使うと、日付として使える文字列かどうかチェックできます。

【12752】Re:複数条件での抽出
質問  木葉  - 15/3/23(月) 14:33 -

引用なし
パスワード
   ▼かるびの様:
お返事ありがとうございます!大変おそくなりました;


> コンボボックスの接頭語ですが、「cbo」の方がいいと思います。
> 「cmb」だと、コマンドボタンを意味する「cmd」と見間違えやすいからです。

あ、なるほど…確かにそうですね!直しておきます。


> 長さ0の文字列の場合にも対応しようというのであれば、Nz関数が使えると思います。

長さ0の文字列ですか…そこまで考えていませんでした!
これって「""」で表される文字の事でしょうか?


> それから、「.Value」は省略しない方がいいと思います。

なるほど、細かい点までありがとうございます!
加えておきます!


> txt発地都道府県の値を変数に受けるか、又はWithステートメントを使えば、
>テキストボックスを参照する回数を1回にできます。
>
> ただし、使う変数を増やすと、その分のメモリー領域を要することになるため、
>コードが遅くなると言われています。
>
> ちなみに私は、無駄に多くの変数を使っています。
> その方がコード内容を読み返したときに理解しやすいし、
>デバッグのときにコードが返す値を確認しやすいからです。

そうだったのですね…
withはエクセルでちょっとだけ使っていましたが苦手だと感じていたので、
私も変数に頼ります。
どのみち時間はかかりますが^^;


>>If Not IsNull(txt開始日) Then
> 例えば、txt開始日の値が「2015/13/32」だとしたら、どうなるか考えてみてください。
>
> Nullじゃないから、このIf文は通ります。
> そうすると、この値を使った条件式がstrFilterに代入されます。
> でも、この値は日付ではないので、Filterプロパティへの代入ででエラーになります。
>
> IsDate関数を使うと、日付として使える文字列かどうかチェックできます。

なるほどです。今試してみたのですが、注意はしてくれるけど入力自体はできるのですね…。
疑問に思ったのですが、
>>If Not IsNull(txt開始日) Then
のままでも、テキストボックスに「13/32」と入力して検索ボタンを押してみると、
もう一度注意が出てきてコードは実行されません。
IsDate関数は省いても問題はないですか?
足元がおぼつかない感じになるのであればこちらも修正させていただこうと思います!

【12755】Re:複数条件での抽出
回答  かるびの  - 15/3/24(火) 3:28 -

引用なし
パスワード
   >長さ0の文字列ですか…そこまで考えていませんでした!
>これって「""」で表される文字の事でしょうか?
 そうです。


>>>If Not IsNull(txt開始日) Then
>のままでも、テキストボックスに「13/32」と入力して検索ボタンを押してみると、
>もう一度注意が出てきてコードは実行されません。
>IsDate関数は省いても問題はないですか?

 それで不満がないなら、IsDate関数を省いても構いません。

 ここにいう「注意」というのは、エラーメッセージのことではないですかね。
 そういうエラーメッセージを出したくないので、IsDate関数を使うことを勧めたわけですが、
ちょっと舌足らずでしたね。

 なお、私であれば、txt開始日に入力された値が日付としておかしなものである場合は、
「日付としておかしい」旨のメッセージを出して、コード実行を終了させてしまいます。

If IsDate(txt開始日.Value) = False Then
  Msgbox "開始日がおかしな日付です。"      
  Exit Sub
Else
  strFilter = strFilter & " AND 日付 >= #" & txt開始日.Value & "#"    
End If

【12757】Re:複数条件での抽出
発言  木葉  - 15/3/24(火) 11:14 -

引用なし
パスワード
   ▼かるびの様:

お返事ありがとうございます!

>ここにいう「注意」というのは、エラーメッセージのことではないですかね
そうですね、そう言った方が適切ですね…ごめんなさい
頭にパッと「エラーメッセージ」が出てこなくて^^;(老化?)

> そういうエラーメッセージを出したくないので、IsDate関数を使うことを勧めたわけですが、
>ちょっと舌足らずでしたね
ありゃ、配慮いただきありがとうございます!
確かに、エラーメッセージそのままだと、エラーの原因が明確ではないですね。
(試してみたら「例えば数値型のフィールドに文字列を入力しました」と出ました。他の人から見たらなんのこっちゃですね。)

コードまで出していただきありがとうございます!

前に回答してくださった箇所も修正の途中なのですが、じっくり直していきます!


取り急ぎ、ありがとうございました!

【12759】Re:複数条件での抽出
質問  木葉  - 15/3/24(火) 16:00 -

引用なし
パスワード
   ひとまず日付の部分だけでも、と思い直してみたのですが、
コードが実行される前にまずエラーメッセージが出るようです。

書式を日付にしているからでしょうか・・?

開始日のフォーカス喪失時などでも試してみましたが、同じような結果でした。


そもそも間違った日付を入力できないように、
入力規則などを設定したほうがいいでしょうか?

規則の条件の書き方も全く分からないのでできれば避けたいのですが…

【12763】Re:複数条件での抽出
回答  かるびの  - 15/3/25(水) 0:54 -

引用なし
パスワード
   >コードが実行される前にまずエラーメッセージが出るようです。

 エラーメッセージが出るとき、strFilterにはどんな文字列が格納されていますか。
 次の方法で確認してみてください。

 まず、「Me.Filter = Mid(strFilter, 6)」の直前の行に
   Debug.Print strFilter
というコードを挿入します。

 次に、VBEでイミディエイトウィンドウを開けます。
 具体的には、VBEのメニューの「表示(V)」→「イミディエイト ウィンドウ(I)」
のコマンドを実行してください。

 その上で、cmdFilter_Clickのイベントプロシージャを実行してみてください。

 イミディエイトウィンドウに、「Debug.Print ××」のコードが実行された時点
におけるstrFilter変数に格納された値が表示されます。


 strFilter中の日付に関する条件式は、
   日付 >= #2015/3/24#  
のようになっていなければいけないのですが、
「2015年3月24日」などとなっていたり、「2015/03」(日にちなし)となっていたりしませんか。


>書式を日付にしているからでしょうか・・?
 strFilter変数は、テキストボックスのValueプロパティ値を基に生成しているところ、
書式をどのように設定しても、テキストボックスのValueプロパティ値には影響しませんから、
書式設定は関係ないと思います。


>そもそも間違った日付を入力できないように、
>入力規則などを設定したほうがいいでしょうか?
 入力規則でもいいでしょう。
 
 ちなみ、私は、入力規則はあまり好きではないです。
 入力規則だと、細かな設定がやりにくいからです。

 私なら、
Private Sub txt開始日_BeforeUpdate(Cancel As Integer)
  If IsDate(Nz(txt開始日.Value,"")) = False Then
    Msgbox "おかしな日付です。"
    Cancel = True
  End
End Sub
とします。
 12755のレスでは、cmdFilter_Clickイベントでメッセージを出すコードを紹介したところですが、
入力チェックをするなら、BeforeUpdateで行うのが常道です。

【12767】Re:複数条件での抽出
質問  木葉  - 15/3/25(水) 11:19 -

引用なし
パスワード
   ▼かるびの様:

お返事ありがとうございます。

> strFilter中の日付に関する条件式は、
>   日付 >= #2015/3/24#  
>のようになっていなければいけないのですが、
>「2015年3月24日」などとなっていたり、「2015/03」(日にちなし)となっていたりしませんか。
>
「AND 日付 <= #2015/03/24#」と表示されました。
ということは正常・・?


> 私なら、
>Private Sub txt開始日_BeforeUpdate(Cancel As Integer)
>  If IsDate(Nz(txt開始日.Value,"")) = False Then
>    Msgbox "おかしな日付です。"
>    Cancel = True
>  End
>End Sub
>とします。
> 12755のレスでは、cmdFilter_Clickイベントでメッセージを出すコードを紹介したところですが、
>入力チェックをするなら、BeforeUpdateで行うのが常道です。

勉強になります。
こちらも試してみたのですが、普通の日付を入力しても「おかしな日付です。」と表示されてしまいました。
前にも書いた通り、テキストボックスには書式設定を日付(S)にしています。
なので、「3/25」と入力すれば自動で「2015/3/25」と表示されるようにしていますが、それに原因があったりしますか?
また、「2015/3/25」や「2015/03/25」と入力してもおかしな日付と表示されてしまいました…。

入力規則ですが、自分で提案しておいて何ですが、苦手なものでやはり避けたい気持ちでいっぱいです…

【12768】Re:複数条件での抽出
発言  木葉  - 15/3/25(水) 11:24 -

引用なし
パスワード
   あ、ごめんなさい。 
>>書式設定は関係ないと思います。
とおっしゃっていただきましたね

>前にも書いた通り、テキストボックスには書式設定を日付(S)にしています。
>なので、「3/25」と入力すれば自動で「2015/3/25」と表示されるようにしていますが、それに原因があったりしますか?
これは無視してください^^;

【12771】Re:複数条件での抽出
質問  木葉  - 15/3/25(水) 15:13 -

引用なし
パスワード
   何度もごめんなさい…

私の勘違いでした…。

ただ、やはり
>Private Sub txt開始日_BeforeUpdate(Cancel As Integer)
>L If IsDate(Nz(txt開始日.Value, "")) = False Then
>    MsgBox "おかしな日付です。"
>    Cancel = True
>  End If
>
>End Sub

を実行する前にエラーメッセージが出てしまうようです。

試しに「13/32」と入力してみたのですが、「おかしな日付です」は出ずに、
「このフィールドに入力した値は正しくありません」と出ます。

う〜ん、どうしたものか…

【12772】Re:複数条件での抽出
回答  hatena  - 15/3/25(水) 16:04 -

引用なし
パスワード
       ▼木葉 さん:
>試しに「13/32」と入力してみたのですが、「おかしな日付です」は出ずに、
>「このフィールドに入力した値は正しくありません」と出ます。

書式プロパティに日付の書式を設定すると、日付/時刻型のValueを持つテキストボックスと判断されるようです。

ですので日付以外のデータを入力するとエラーメッセージが表示されます。このエラーは更新前イベントより前に発生するので更新前イベントでは補足できません。が、フォームのエラー時のイベントで補足できます。

Private Sub Form_Error(DataErr As Integer, Response As Integer)
  Msgbox "エラー番号は" & DataErr
  Response = acDataErrContinue '既定のエラーメッセージを表示しない
End Sub

として日付以外のデータを入力すると「エラー番号は2113」と表示されます。
そこで下記のように書き換えれば希望のメッセージに変更できます。

Private Sub Form_Error(DataErr As Integer, Response As Integer)
  If DataErr = 2113 Then
    MsgBox "おかしな日付です。"
    Response = acDataErrContinue '既定のエラーメッセージを表示しない
  End If
End Sub

【12774】Re:複数条件での抽出
お礼  木葉  - 15/3/25(水) 17:21 -

引用なし
パスワード
   ▼hatena様:
お返事ありがとうございます。

>書式プロパティに日付の書式を設定すると、日付/時刻型のValueを持つテキストボックスと判断されるようです。

>ですので日付以外のデータを入力するとエラーメッセージが表示されます。このエラーは更新前イベントより前に発生するので更新前イベントでは補足できません。

なるほど…そういうことなのですね…
テキストボックスのイベントを巡って色々試していたのですが、すべてエラーが先に出てしまうので、頭を抱えておりました。

>が、フォームのエラー時のイベントで補足できます。

ご丁寧にコードまで、ありがとうございます!
Responseという単語、調べてもあまり検索に引っかからないようで、
良く分からなかったですが、解決致しました!

一応完成したものを載せておきます

【検索ボタン】クリック時
Private Sub cmdFilter_Click()

Dim strFilter As String

Dim torihiki As Variant
Dim startt As Variant
Dim start As Variant
Dim goalt As Variant
Dim goal As Variant
Dim sday As Variant
Dim gday As Variant

torihiki = cbo取引先.Value
startt = txt発地都道府県.Value
start = txt発地.Value
goalt = txt着地都道府県.Value
goal = txt着地.Value
sday = txt開始日.Value
gday = txt終了日.Value


If Not Nz(torihiki, "") = "" Then
strFilter = " AND " & "取引先コード Like '" & torihiki & "'"
 End If

If Not Nz(startt, "") = "" Then
strFilter = strFilter & " AND 発地都道府県 Like '*" & startt & "*'"
End If

If Not Nz(start, "") = "" Then
strFilter = strFilter & " AND 発地 Like '*" & start & "*'"
End If

If Not Nz(goalt, "") = "" Then
strFilter = strFilter & " AND 着地都道府県 Like '*" & goalt & "*'"
End If

If Not Nz(goal, "") = "" Then
strFilter = strFilter & " AND 着地 Like '*" & goal & "*'"
End If

If Not Nz(sday, "") = "" Then
strFilter = strFilter & " AND 日付 >= #" & sday & "#"
End If

If Not Nz(gday, "") = "" Then
strFilter = strFilter & " AND 日付 <= #" & gday & "#"
End If

Debug.Print strFilter

  Me.Filter = Mid(strFilter, 6)
  If strFilter = "" Then
    Me.FilterOn = False
  Else
    Me.FilterOn = True
  End If


End Sub


【フォーム】エラー時

Private Sub Form_Error(DataErr As Integer, Response As Integer)
If DataErr = 2113 Then
    MsgBox "おかしな日付です。"
    Response = acDataErrContinue '既定のエラーメッセージを表示しない
    End If
End Sub

--------
Variant型は省略してもいいと書かれていましたが一応…

かるびの様にご指摘いただいていた分、訂正できたと思います!
(あまり自信はないですが)

長い期間お世話になりましたかるびの様、
お助けいただいたhatena様、
初心者である私に親切に、ご丁寧にご教授いただきありがとうございます!

また質問させていただくことがありましたら宜しくお願いします^^

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