• ベストアンサー

エクセルのマクロを使い、ある任意の期間の行を削除したい

皆様、調べても分からなかったので教えて下さい。 エクセルで作ったデータベース上で、ある列に日付データが入っています。 マクロを実行すると、任意の期間(例えば2月)を入力し、任意の期間以外の行を削除する(1月や空白)マクロを作りたいです。 どなたかご教授下さい。 よろしくお願いします。

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

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

こんばんは。Wendy02です。 こういうものは、実務レベルの内容なので、ある程度パターンだけをメモしてしまえば、そのまま、使えるものばかりです。本当は、Visual SourceSafe みたいなソースとのデータベースを使えば、後々の検索が楽かもしれませんが、簡単に手に入りませんので、メモ帳などに、ストックしておくとよいです。私のメモは、項目数で、だいたい、1,100件を持っています。 >また「Month2」の設定はmyMonthの翌月の0日という事でしょうか? 翌月の0日は、1日の前の日、つまり、その月の晦日(末日)になります。試してみてください。 InputBox は、まず、なるべく、メソッド側を使って、関数のほうはやめたほうがよいです。しかし、その分、面倒な約束事が増えます、 Application.InputBox("検索月を入れてください。", Type:=2) InputBox は、単に決まったパターンは、2つしかありません。 通常、戻り値の変数は、文字型にするという方法が一般的です。しかし、今回、その後で、数値型に変えますので、InputBox の戻り値は、Variant 型に換えました。以下のコードでは、厳密に型の自動キャスティング(変換)をあてにしないで、CInt で変換していますが、慣れなければ、そのまま、Variant 型で、やり取りしてもかまいません。 なお、余談ですが、Type:=1 型ですと、0を入力するような場合は、数値型の変数で受けてしまうと、キャンセルと同じになってしまいます。 修正部分 '--------------------------------------------- これは、Vairant 型にしてください。 'Dim myMonth As Date Dim myMonth As Variant  myMonth = Application.InputBox("検索月を入れてください。", Type:=2)   If VarType(myMonth) = vbBoolean Or myMonth = "" Then Exit Sub    myMonth = CInt(myMonth) 'myMonth =2 のところまでに重なる 'なお、 '#少し気になる部分があります。 '後で気がついたことですが、 ' .Offset(1).SpecialCells(xlCellTypeVisible).EntireRow.Delete '行全体を削除 .Offset(1).Resize(.Rows.Coun -1). _ SpecialCells(xlCellTypeVisible).EntireRow.Delete '行全体を削除 1つ下がったのだから、範囲は狭くならないと、厳密には間違っていますから、以下のほうがよいかもしれません。あまり影響はないはずですが。これも決まったパターンです。 念のためにコードも載せておきます。 一応、標準モジュールのほうがよいでしょうね。 '---------------------------------------------- Sub OutMonthDeleteR()  Dim Month1 As Date  Dim Month2 As Date    Dim myMonth As Variant  myMonth = Application.InputBox("検索月を入れてください。", Type:=2)  If VarType(myMonth) = vbBoolean Or myMonth = "" Then Exit Sub    myMonth = CInt(myMonth) 'myMonth =2 のところと重なる  Month1 = DateSerial(Year(Now), myMonth, 1)  Month2 = DateSerial(Year(Now), myMonth + 1, 0)    If ActiveSheet.AutoFilterMode Then   ActiveSheet.ShowAllData  End If    With Range("A1").CurrentRegion       .AutoFilter _       Field:=1, _       Criteria1:="<" & Month1, _       Operator:=xlOr, _       Criteria2:=">" & Month2       .Offset(1).Resize(.Rows.Count - 1). _   SpecialCells(xlCellTypeVisible).EntireRow.Delete '行全体を削除   ActiveSheet.AutoFilterMode = False  End With End Sub

noname#82622
質問者

お礼

Wendy02様 すぐに回答を頂いたのですが、お礼が遅くなり、申し訳ございません。 マクロ初心者な為、作成して頂いた内容をヘルプを参照しながら解読するのに時間がかかってしまいました。 おかげさまで、この件について解決する事が出来ました。 とても感謝しております。 ありがとうございました。

その他の回答 (3)

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

(1)マクロの記録をとる状態にして、ある1行を削除する操作を行う (2)1月以外の月行をMsgboxで表示するプログラムを作る。 その際 If文を使う 日付から年月を抜き出すYear,Month関数を調べる (3)最終行を知るプロパティを調べる End(xlUp)など (4)下の行から上の行に向かって、IFで条件に合うものを削除していく。For Next Step -1 ここまでヒントを出しますから、WEBででも後は調べてください。 過去質問にも出ている質問です。

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

こんばんは。 たとえば、こんなことですか? 余り考えて作っていませんから、間違っていたらすみません。(今、少し気になる部分があります。また、バージョンの違いによって、うまくいかない可能性があります。)とりあえず、試してみてください。 日付が、1列目に入っている場合は、 以下のコードの中で、 Field:=1  ←が、1です。そうでない場合は、その列の番号を入れてください。 また、タイトル行(一番上の行の名称)が入っていることを予想して作られています。ある程度、マクロが読めれば、加工が可能だと思います。 '--------------------------------------------------------------------- Sub OutMonthDelete()  Dim myMonth As Date  Dim Month1 As Date  Dim Month2 As Date  '月数を入れる 'InputBox でもよい  myMonth = 2  Month1 = DateSerial(Year(Now), myMonth, 1)  Month2 = DateSerial(Year(Now), myMonth + 1, 0)    If ActiveSheet.AutoFilterMode Then   ActiveSheet.ShowAllData  End If    With Range("A1").CurrentRegion       .AutoFilter _       Field:=1, _       Criteria1:="<" & Month1, _       Operator:=xlOr, _       Criteria2:=">" & Month2          .Offset(1).SpecialCells(xlCellTypeVisible).EntireRow.Delete '行全体を削除   ActiveSheet.AutoFilterMode = False  End With End Sub

noname#82622
質問者

補足

ご回答ありがとうございます。 マクロを覚えようと始めたばかりなので、作成して頂いた内容をヘルプを駆使して解読しようと勉強しています。 InputBoxで「myMonth」に値を入れる時に、キャンセルボタンを押すと、長さ0の文字列を返すようですが「Date」で宣言するとエラーになるようです。 この場合「myMonth」をどのような型で宣言しておくのがよいのでしょうか? また「Month2」の設定はmyMonthの翌月の0日という事でしょうか? 質問ばかりですみません。

noname#91724
noname#91724
回答No.1

例えば、 その列で昇順の並び替えをして、 任意の日付(EX.20070201)を検索し、 行数を取得し、そこまで削除する、 といった方法はどうでしょうか。

関連するQ&A