• ベストアンサー

(VBAにて)日付でデータを抽出するやり方

ド素人なのですが、上司にマクロ作成を依頼され困っています。 下記に内容を記しますので、教えて下さい。 お願いします。 ・VBAを使ってExcelで管理してある管理表(下記参照)を 「発生年月日」をキーにして 「開始月:yyyy/mm」と 「終了月:yyyy/mm」をそれぞれ入力して、コマンドボタンを押したら  その指定した範囲内のみのデータを別シートに表示するように  して欲しい。 (例) 開始月:2007/8 終了月:2007/11 →2007年8月~2007/11月分の全データが別シートに表示される) ・管理表はこんな感じです。(大体、月に4件ぐらいあります)   発生年月日      件名    内容      完了日   (yyyy/mm/dd) (障害件名)  (障害内容)  (yyyy/mm/dd) よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • imogasi
  • ベストアンサー率27% (4737/17070)
回答No.2

プログラム以外の知識 (1)エクセルの日付は、見た目年月日に見えているが、そのセルの値は日付セリアル値という(1900年1月1日から何番目の日かという正整数を持ってます。 ですから、開始月:2007/8は開始日:2007/8/1から、終了月:2007/11 は終了月:2007/11/30と考えて、日付でやる方法が生まれます。 (2)あるセルに日付があった場合、そこから年、月を取り出す関数があること。Year、Month関数です。 あと年数、月数で文字列と数値の区別に注意が必要です。 (3)フィルタなどのエクセル固有の機能があることも知っておくべきです。 VBAプログラムは上記3つの路線で考えることが可能です。 ーー プログラムの知識 (1)データの最下行を知るコード (2)全行総なめして判別を繰り返す手法を採る場合、繰り返し法 (3)他シートに書き出す法 (4)月末日を出すコード ーーー (1)の方式でやってみます。 下記は書式は移しません。 Sub test01() Dim sh1 As Worksheet Dim sh2 As Worksheet Set sh1 = Worksheets("Sheet1") Set sh2 = Worksheets("Sheet2") '---- d = sh1.Range("A65536").End(xlUp).Row ' MsgBox d k = 2 f = sh2.Range("C1") t1 = sh2.Range("D1") t = DateSerial(Year(t1), Month(t1) + 1, 1) - 1 ' MsgBox t For i = 2 To d If sh1.Cells(i, "A") >= f And sh1.Cells(i, "A") <= t Then ' MsgBox sh1.Cells(i, "A") sh2.Cells(k, "A") = sh1.Cells(i, "A") sh2.Cells(k, "B") = sh1.Cells(i, "B") k = k + 1 '--以下C,D・・列分を必要分並べる End If Next i End Sub '--- Shwet2のA列は日付書式にする。 Sheet2のC1,D1は書式をy年m月にし、2007/9とかいれると値は2007/9/1になり、表示は2007年9月と見えます。 コマンドボタンの件はわかると思うが、 上記をクリックイベントのコードに挟む。 Private Sub CommandButton1_Click() test01 End Sub

tatuya24_2006
質問者

お礼

回答ありがとうございました。 大いに参考になり、おかげでメドが立ちました。 正直、マクロ文の意味はよく分かっておりませんが 結果は出ました。 少しづつ勉強して、学んでいこうと思います。 ありがとうございました。

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 「フィルタ・オプション」を調べてみたらよいと思いますね。これにちょっと記録マクロとボタンをマクロをつけただけで、使った人はびっくりします。 今回は、[表示する側のシート]で、データ-フィルタ-フィルタオプョションの設定 ということをするのがミソです。 開始月:2007/8 終了月:2007/11 入力は、 2007/8/1 2007/11/30 という範囲になります。 この場合の フィルタ・オプションの検索条件は、横に並べます。 発生年月日  発生年月日 =">="&G1   ="<="&G2 とすればよいですね。 一度成功したら、後は、記録マクロをしてあげます。 そうすると、以下のようなものが出来上がっていますから、あとは、コントロールキー側のコマンド・ボタンの中に入れてあげればよいです。   Sheets("Sheet1").Range("A1:D53").AdvancedFilter Action:=xlFilterCopy, _     CriteriaRange:=Sheets("Sheet1").Range("H1:I2"), CopyToRange:=Range("A1:B1") _     , Unique:=False この部分が、データ部分 Sheets("Sheet1").Range("A1:D53") この部分が、検索条件 Sheets("Sheet1").Range("H1:I2") この部分が、貼り付け部分。 ただし、この場合は、どこに貼り付けるのかはっきりしていませんから、 Range("A1:B1")    ↓ Sheets("Sheet2").Range("A1:B1") とします。 それを、こんな風に見やすくしてあげると、分かりやすいです。 -------------------------------------------------------- 完成例: 'シートモジュール Private Sub CommandButton1_Click()  Worksheets("Sheet1").Range("A1:D53").AdvancedFilter _     Action:=xlFilterCopy, _     CriteriaRange:=Worksheets("Sheet1").Range("H1:I2"), _     CopyToRange:=Worksheets("Sheet2").Range("A1:B1"), _     Unique:=False  Worksheets("Sheet2").Select End Sub

tatuya24_2006
質問者

お礼

回答ありがとうございました。 おかげでメドが立ちました。 感謝しております。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

「開始月:yyyy/mm」と 「終了月:yyyy/mm」をそれぞれ入力して、コマンドボタンを押したら  その指定した範囲内のみのデータを別シートに表示するように  して欲しい。 ⇒”入力してコマンドボタンで実行”と言う事はセルに入力と言う事? >上司にマクロ作成を依頼され困っています。 VBAを作成されたことはあるのですか? まずサンプルを希望されているのなら、具体的なセル番地等々を提示されては? 一案でよければ、オートフィルタを使えば出来そうですが。 →2007年8月~2007/11月分の全データが別シートに表示される ⇒2007/8/1~2007/11/30までと置き換えれば可能かと。

tatuya24_2006
質問者

補足

返信してくださいまして、ありがとうございました。 おかげでメドがつきました。 感謝しております。

関連するQ&A