- ベストアンサー
エクセル2007のVBAで特定の日付のみにオートフィルタのチェックを入れる方法
- エクセル2007のVBAでオートフィルタのチェックを特定の日付のみに入れる方法を教えてください。
- ユーザー設定フィルタでは視覚的に解りつらい為、フィルタの▽をクリックした時に、チェックがされている事を確認したいです。
- 試行錯誤の状態のコードで失礼します。Selection.AutoFilter Field:=1, Criteria1:=Array("日付"), Operator:=xlFilterValues, Criteria2:=Array(buf)この部分のbufの記述方法がわかりません。宜しくお願い致します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こちらを参考にされると良いかと思います。 http://officetanaka.net/excel/vba/tips/tips151.htm 以下はサンプルコード。 Sub sample() 'sampleBook作成からCall test With Workbooks.Add(xlWBATWorksheet).Sheets(1) .Range("A1").Value = "field1" .Range("A2").Value = #7/1/2012# .Range("A2").AutoFill .Range("A2:A100") End With Stop '確認用 Call test End Sub Sub test() Dim d1 As Date Dim d2 As Date Dim d As Date Dim n As Long Dim i As Long Dim j As Long Dim v With ActiveSheet.Range("A1:A100") d1 = Application.Min(.Cells) '月単位 d2 = #9/1/2012# n = DateDiff("m", d1, d2) ReDim v(1 To n * 2) For i = 1 To UBound(v) Step 2 d = DateAdd("m", j, d1) j = j + 1 v(i) = 1 '※ v(i + 1) = d Next .AutoFilter Field:=1, Operator:=xlFilterValues, Criteria2:=v Stop '日単位 d1 = #7/11/2012# d2 = #8/11/2012# n = DateDiff("d", d1, d2) ReDim v(1 To n * 2) j = 0 For i = 1 To UBound(v) Step 2 d = DateAdd("d", j, d1) j = j + 1 v(i) = 2 '※ v(i + 1) = d Next .AutoFilter Field:=1, Operator:=xlFilterValues, Criteria2:=v End With End Sub
その他の回答 (1)
- end-u
- ベストアンサー率79% (496/625)
#>宜しくご教示願います。 #締め切られたら追加レスできないです。気をつけましょう。 既に紹介した田中亨氏のwebページ http://officetanaka.net/excel/vba/tips/tips151.htm ここの最下部見てください。 日付フィルタの条件は1次元配列で指定します。 配列(条件1の数値,条件1の日付データ,条件2の数値,条件2の日付データ,…) (1,#2012/06/01#,1,#2012/07/01#,…) 配列の最初から、1条件あたり2個1組で指定するわけです。 Sub sample() Dim d1 As Date Dim d2 As Date Dim d As Date Dim n As Long Dim i As Long Dim j As Long Dim v d1 = #6/1/2012# d2 = #9/1/2012# n = DateDiff("m", d1, d2) MsgBox n & " ヶ月分" ReDim v(1 To n * 2) For i = 1 To UBound(v) Step 2 'DateAdd("m"..つまり月を増分させる。 d = DateAdd("m", j, d1) j = j + 1 v(i) = 1 v(i + 1) = d Next For i = 1 To UBound(v) Debug.Print v(i) Next Stop End Sub Stopで止まった時、VBE画面で[Alt]→[v]→[s]キー順押し、 [ローカルウィンドウ]を表示させてください。 配列 v の左、田マーククリックで 配列の中身が展開します。 v(1) 1 v(2) #2012/06/01# v(3) 1 v(4) #2012/07/01# v(5) 1 v(6) #2012/08/01# この配列を作る為に、3ヶ月分の条件の場合は 3×2の 6要素のサイズの1次元配列を準備し、 Loop時に1つ飛ばしで v(i) = 1 v(i + 1) = d 2要素ずつ値をセットしてるわけです。 >また、'※は月単位と日単位で数値が異なるのでしょうか? これも前述のページに書いてありますから読んでくださいね。 <引用> 0:後ろに指定した日付の年 1:後ろに指定した日付の月 2:後ろに指定した日付の日 3:後ろに指定した時刻の時 4:後ろに指定した時刻の分 5:後ろに指定した時刻の秒 </引用>
お礼
end-uさま ご丁寧な解説をありがとうございます。 goo質問のやり方すら知らなくて、「補足」に「補足」を追加したらレスは出来なくなる事を知り、BAを付けてしまいました。 それを、サポート担当様へ追加メールのお手数までお掛けし、誠に感謝致します。 また、サポート担当様も掲載のご検討頂きありがとうございました。この場でお礼を申し上げます。 ><引用>・・・以下 この部分も見ていて、月は1、日は2が必要なのか…と思ってはいましたが、配列格納時に (1,#2012/06/01#,1,#2012/07/01#,…)の ","が自動で入る(格納される)のを知らなかった為、理解出来ていませんでした。。。 それ故、どこがどうなっているのか更に混乱してしまいました。 本当にありがとうございました!
お礼
end-uさん、いつもお世話になります。 お忙しい中、早速のご回答ありがとうございます。 貴officetanakaのページはとても参考になります。 ご紹介頂いたページも既に見ておりましたが(熟読出来てない?)、私に基本的な 基礎が無くカットアンドトライ・コピペ・コピペ・質問・質問・カットアンドトライなのです。 VBAに手を出すべきではない・・・のかも。orz(真似) ご提示頂いたコードもレベルが高いです。 ですが!がんばります! まずは、お礼まで^^
補足
end_uさん、こんばんは '月単位を使用し、終了日は変数にしたかったので d2 = CDate(YY & "/" & MM & "/" & EoD) + 1 で上手く行きました。ありがとうございます^^ ところで、後学の為に教えて欲しいのですが、 ReDim v(1 To n * 2) For i = 1 To UBound(v) Step 2 これはnを2倍して、iを1つ飛びにしているのは何故でしょうか? また、'※は月単位と日単位で数値が異なるのでしょうか? 宜しくご教示願います。