- ベストアンサー
VBAを利用しオートフィルタで日付抽出でエラー
会員管理表を作っています。 集計シートと入金管理シートがあり、入金管理シートに入金日を 入力させ集計シート上でオートフィルターを実行し、表示された データだけを入金管理シートに抽出し印刷するというマクロを 作っています。 問題は、入金管理シートに"2007/4/27"と入力し、このセルを Stringで宣言した変数に格納すると値が"2007/04/27"となります。 オートフィルタでこの変数を使用すると、当然2007/04/27で検索され ますが、集計シートの日付は"2007/4/27"と表示されていてヒット しません。月や日付の04や05の0が入らないように変数にセット する方法はありますか?ちなみにどちらの書式設定は、日付で yyyy/m/dを指定しています。教えてください。 集計シートはこんな感じです。入金日でフィルタをかけてます A B C D 会員番号 会員名 入金日 入金額 0001 ぐうた 2007/4/27 1,000 0002 ぐうこ 2007/5/1 500 管理シートはこんな感じです。入力時には04と入力せず4と入力 しています。 【2007/4/27】入金データ A B C 会員番号 会員名 入金額 0001 ぐうた 1,000
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。#1 のWendy02です。 こちらは、以下のようにすれば通るのですが、どうも、バグっぽい感じがまだ残っていますね。 私は、Excel 2003 + XP で行っているから出来るともいえます。 >"4/27/2007"となってしまいました。 と見えるものは、関係ありません。それは、Date型のリテラル値です。もちろん、文字で比較するわけではありません。しかし、最初に書いたように、Excelのバージョンで反応が変わってくるはずです。 >オートフィルタでヒットする日付は”2007/4/27”だけで”2007/04/27”では返ってきません。オートフィルタではシリアル値で検索していないのでしょうか? ワークシートからは、Enter キーを入れることによって、代入値の型の自動変換がありますが、ワークシートでは型の自動変換はありません。 それは、ともかく、以下でうまく行かないのでしたら、Excelのバージョンを示してくださらないと、オートフィルタにはバージョンによって、まったく出来ないバグがあるのですから、分からないのです。 書式の一致は関係ありません。 Sub testSort() Dim nyu_day As Date nyu_day = Cells(3, "C").Value Selection.AutoFilter Field:=8, Criteria1:=nyu_day, Operator:=xlAnd End Sub なお、うまく行かない簡単な対処法としては、隠し列を作って、そこにシリアル値に変換した数値をいれておき、次に、セルから取った検索値を、Long型の変数に入れて、検索するという方法があります。
その他の回答 (3)
- zap35
- ベストアンサー率44% (1383/3079)
#02です。試してみました。 A列に 2007/4/1、2007/4/2 … という日付 B1に 2007/4/8 ←絞り込みたい日付(書式を標準にすると39180) を入力して Sub Macro3() Dim b b = Range("B1").Value Columns("A:A").AutoFilter Field:=1, Criteria1:=b End Sub を実行したらちゃんと絞り込みができましたよ。 ステップ実行してbの値をみると 2007/04/08 となります。 コントロールパネルの「地域と言語の設定」で日付の形式を色々と変更してみましたが、それでも動きます。何か問題が違うように感じますが… また【】も少し気になります・・ 一度上のデータを入力して、このマクロが動くか教えていただけませんか? なお私の環境はXP SP2+Office2003です
お礼
初期情報が足りず、ご迷惑をおかけしました。 紹介いただいた内容だとうまくいきましたが、応用がきかない ようです。バージョンのせいでしょうか。 どうもありがとうございました。
補足
試してみました。確かに上記記述はうまくいきましたが オートフィルタでオプションに入力されている値を確認しOKを 押したら表示されなくなってしまいました。 上記マクロではうまくいったので、変数を指定せず nyu_day = Range("C3")とセットしてやってみましたが、やはり 結果は同じでした。 フィルタオプションでセットされていたのは、どちらの場合も ”4/27/2007”でした。 私の環境はEXCEL2002なのですが、バグなのでしょうか?
- zap35
- ベストアンサー率44% (1383/3079)
どのようなメソッド、ワークシート関数で絞り込み検索しているか書かれていませんが、日付(2007/4/27)はExcel内部では39199という数値データです。これと"2007/04/27"の文字列を比較しても合致しません。 >Stringで宣言した変数に格納すると値が"2007/04/27"となります なぜString型を使用するのですか? 日付を格納するなら変数をVariant型にしておけば良いのではないでしょうか。
補足
No1さんにも補足しましたが、Date型やVariant型にすると オートフィルタにセットすると、4/27/2007とセットされてしまい もとの集計シートの入金日で表示されている2007/4/27とあわずに ヒットしません。 オートフィルタでヒットする日付は”2007/4/27”だけで ”2007/04/27”では返ってきません。オートフィルタではシリアル値で 検索していないのでしょうか?
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 Excelのバージョンにもよりますが、確か、Excel2000では、そのあたりで検索できないというバグがあります。その場合の方法はあります。 >入金管理シートに"2007/4/27"と入力し、このセルをStringで宣言した変数に格納すると値が"2007/04/27"となります。 >集計シートの日付は"2007/4/27"と表示されていてヒットしません。 String型でヒットするほうが不思議です。ワークシート上のデータは、シリアル値であるはずですから、どのような表示であれ、Date型のはずです。(つまり中身は変わらないということ)実際問題として、シートのセルに文字列日付を入れるのは不自然かもしれません。 文字型で入力されているなら、一旦、日付型に変更してあげなくてはなりません。 例: myDate = CDate(Range("B1").Value) ただし、動かない場合は、Excelバージョンとコードを見せてください。文章だけでは限界があります。
補足
実は、変数の型をDateで宣言して作ったのですがフィルタに かけると"4/27/2007"となってしまいました。 そこで、いろいろ試してStringで変数をきりました。 2007/04/27も2007/4/27もシリアル値は同じである事は認識して いるのですが、VBAでオートフィルタを使用する際にどのように セットしたら、フィルタでヒットするかわからないでいます。 ちなみに今の記述は、以下のとおりです。(C3に入金日を入力する) Dim nyu_day As String nyu_day = Cells(3, "C") Selection.AutoFilter Field:=8, Criteria1:=nyu_day, Operator:=xlAnd これで、入金日の入力は2007/4/27と入力していますが nyu_dayで取得すると2007/04/27となっています。 Date以外で使える変数は、どれがいいのでしょうか?
お礼
いまくいかない対処法で回避できました。 いろいろとありがとうございました。 当面EXCEL2002を使っていくので、オートフィルタで日付を使った 抽出をするときは、シリアル変換された値で見ることにします。 とても助かりました。
補足
バージョン情報ですが、EXCELは2002です。XPはSP2です。 上記でテストしてみましたが結果変わらずでした。 うまくいかない場合の対処をやってみます。