• ベストアンサー

エクセル 日付比較のマクロ

以下の処理をエクセルで自動で行おうと思っています。 ___________A列__________________B列 1行目 2008/9-2009/7______終了 2行目 2009/3/12 ____________実施中 3行目 2008/10-2009/8_____終了 4行目 2008/9~2009/7_____終了 5行目 2008/10~2009/8 ___終了 6行目 2009/9/1 ______________実施中 B列が「実施中」でA列が処理日の「翌月以降」の行と B列が「終了」でA列が処理日の「前月以前」の行を 削除するマクロを作成したい。 例:2009/8/10に処理する場合、    A1が 2008/9-2009/7の行は削除対象    A4が 2008/9~2009/7の行は削除対象 A6が2009/9/1の行は削除対象 なお、年月日指定、年月の期間指定(ハイフンと~が混在) の2つの形式がある。 処理日との日付比較をどのように行えば良いでしょうか?

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

  • ベストアンサー
  • hotosys
  • ベストアンサー率67% (97/143)
回答No.3

こんなのではどうでしょうか? まず、B列が終了の場合だけA列が2つの日付(期間)になっている場合です。 まず考え方としては、前月以前と来月以降だけが問題になるので、各処理中の日付はその月の1日として処理します。 例えば2009/7は2009/7/1、2009/3/12は2009/3/1、処理日の2009/8/10は2009/8/1とすると、単純な大小比較で処理できると思います。 また、期間の~は半角マイナスに変換してから処理します。 2009/7などはdatevalue("2009/7")とすると自動的に2009/7/1に変換してくれますが、datevalue("09/7")などは2009/9/7になってしまいます。 datevalue("09/7/1")とすれば2009/07/01になるので、その処理も入れました。 Sub sample() Dim today As Date Dim lastRow As Long Dim r As Long Dim val As String Dim d() As String Dim v As String today = Date '処理日取得 today = DateSerial(Year(today), Month(today), 1) '処理日の月の1日に lastRow = Range("A" & Rows.Count).End(xlUp).Row For r = lastRow To 1 Step -1 val = Range("A" & r).Value val = Replace(val, "~", "-") '~を-" 'val = Replace(val, "-", "-") '必要なら全角マイナスを半角マイナスへ 'val = Replace(val, "ー", "-") '必要なら長音記号を半角マイナスへ d = Split(val, "-") '-で分割 Select Case Range("B" & r).Value Case "実施中" If InStr(InStr(d(0), "/") + 1, d(0), "/") = 0 Then d(0) = d(0) & "/1" '年/月の場合に年/月/1にする処理(たぶんなくてもいい) If DateSerial(Year(DateValue(d(0))), Month(DateValue(d(0))), 1) > today Then 'A列の日付の月の1日の日付が処理日の月の1日の日付より大きければ Rows(r).Delete '削除 End If Case "終了" If InStr(InStr(d(1), "/") + 1, d(1), "/") = 0 Then d(1) = d(1) & "/1" '年/月の場合に年/月/1にする処理(たぶんなくてもいい) If DateSerial(Year(DateValue(d(1))), Month(DateValue(d(1))), 1) < today Then 'A列の2番目の日付の月の1日の日付が処理日の月の1日の日付より大きければ Rows(r).Delete '削除 End If Case Else MsgBox "データ異常" Exit Sub End Select Next End Sub p.s. DateSerialは便利な関数で、DateSerial(2009,12+1,1)とすると自動的に2010/01/01にしてくれます。 DateSerial(2009,1-2,1)は2008/11/01にしてくれます。

dejiichi
質問者

お礼

ありがとうございます! ためしてみます!

その他の回答 (2)

回答No.2

日付の列を開始日と終了日で列を分けておけば入力も後の処理も簡単になるのに、どうしてわざわざ「 2008/9-2009/7」みたいな面倒な入力をさせているのでしょう、不思議です。いまからでも分けておかないと、また他の処理で困ることになるでしょう。 作業列を使えば、フィルタでなんとかなりそうですが、どうしてもマクロでないと駄目なんでしょうか?

dejiichi
質問者

お礼

実際にはもっと複雑な複数シートからなる表です。 以前からそのような日付で運用されていました。 どうしてもマクロでなくてもいいですが、効率化したいので、、

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

A列が内容的に日付的なデータで、B列が終了、実施中などのデータか。 ~は「-」(半角に置き換えてもよいか。触れないのか。 ーーーー ヒントは VBAであれば、プログラム内で Sub test01() x = Cells(1, "A") d1 = DateSerial(Year(x) - 1, Month(x) + 1, 1) d2 = DateSerial(Year(x), Month(x) - 1, 1) s1 = Year(d1) & "/" & Month(d1) s2 = Year(d2) & "/" & Month(d2) s3 = s1 & "-" & s2 MsgBox s1 MsgBox s2 MsgBox s3 End Sub のようにs1.S2を作る。 その際DateSerial(Year(x) - 1, Month(x) + 1, 1)のように日付シリアル値にするとき、月や年に+1やー1しないと、単純にMonth(x)+1すると、年末月などで13月になったりするので上記にした。 ーーーー また2008/9-2009/7のような行は Sub test02() x = Cells(2, "A") y = Split(x, "-") MsgBox y(0) MsgBox y(1) End Sub で2つに分離する。 そしてs1 とy(0),S2とy(1)を各々比較して範囲内月かチェックする。 またはそのままs3とTest02のx(セルの値文字列)と比較してもよいのかな。 ーー 該当した場合 行削除のコードは判っていますよね。マクロの記録をとれば判る。 ーー 以上は~を操作でーに置換出来てそのあとのこと。 置換してはダメの場合、プログラムの変数の中で~をーに置換した文字列を作り、あとの処理を始める。

dejiichi
質問者

お礼

ありがとうございます! ためしてみます!

関連するQ&A

  • エクセルのマクロについて

    エクセルのデータ処理で困っています。 A列とB列に8000行記入されており、A列とB列の内容をA列にまとめる処理を行おうとしています。 具体的には、元のデータA1、B1、A2、B2を新たにA1、A2、A3、A4に整理する処理です。 マクロを使えば容易に処理できると思うのですが、当方エクセルに詳しくなく困っています。 お詳しい方、処理方法などをご教授していただけないでしょうか。 よろしくお願いいたします。

  • Excelマクロでセルの比較

    Excelマクロでセルの比較 まだマクロ初心者なので、詳しいことがわからなくて困っております。 例)●前提として何行目まであるかは変化します     (A列)(B列) (1行目) 35  35 (2行目) 26  26 (3行目) 13  13 (n行目) 12  12 ※n=最終行 【やりたいこと】 このようにシートに入力されていたとして、 「A1=B1?」⇒「A2=B2?」⇒「A3=B3?」⇒「An=Bn?」と比較を進めていき不一致の有無を出す。 もし不一致がなければ、そのまま通過しその次のマクロを実行していく。 不一致があった場合には、不一致の行を別ファイルに出力してファイル保存し、ファイルを閉じる。 マクロを実行している元のファイルは、保存せずにファイルを閉じる) 行の長さが変化するため、その変化にも対応した処理を実行したいと思っております。 本やサイトで調べてみたのですが、基礎知識がないためうまく処理をさせるマクロを作ることが出来ませんでした。 このようなマクロが可能なのかもわかりませんが、出来ましたらこのマクロを教えていただけますでしょうか。 宜しくお願いいたします。

  • ExcelのVBAで複数行削除を行う場合

    Excel2007のVBAで複数行を削除する方法を教えて下さい。 Excel2003で使用していたマクロが使えなくなってしまいました・・・。 下記のようなExcelシートに対して複数行ずつ行を削除し、削除対象が無くなるまで 削除処理を行うか、指定した行まで削除処理を行うという事をしたいのですが うまく動きません。 例      A列   B列   C列   D列   E列 1行目 aaa1   bbb1  ccc1 2行目             ccc2 3行目             ccc3 4行目             ccc4 5行目 aaa2   bbb2  ccc1 6行目             ccc2 7行目             ccc3 8行目             ccc4 例に対しての結果      A列   B列   C列   D列   E列 1行目 aaa1   bbb1  ccc4 2行目 aaa2   bbb2  ccc4 例に対して、複数行(指定した行数ここでは3行)の削除を行いたいのですが、 単純に複数行(3行)ずつ削除していくのではなく。 1行目や5行目にあるように文字や情報が入力されているA列とB列の情報は 残しつつ、4行目のC列以降の列の情報はすべて活かしていくという事をしたいのです。 Excel2003の時に使用していたVBAは以下のものです。 Sub 行を削除するマクロ() Workbooks("xxxx.xlsx").Activate '処理を行いたいExcel ※1 n = n + 0 LastRow = 2138           '処理を終了させたい行 ※2 Sheets("Sheet1").Select '処理を行いたいシート ※3 Do Until (n > LastRow) Rows(n + 4).Delete Shift:=xlsiftUp '削除したい行指定 ※4 n = n + 3 Loop End Sub 皆様の良いアドバイスやお知恵をお貸しください。 よろしくお願いします。

  • エクセルマクロ配列で変数は使えますか

    エクセル2013です。 初めて配列を使います。 以下のように作成し思ったようにできました。 Sub 計算() '成功 Dim a As Integer Dim c As Integer Dim b(5) As Integer Dim 最終行 Dim 値列  値列 = 17 最終行 = Cells(Rows.Count, 1).End(xlUp).Row For 処理業 = 1 To 最終行 For a = 1 To 5 b(a - 1) = Cells(1, 値列) 値列 = 値列 + 1 Next 値列 = 17 For a = 1 To (22 - 値列) c = c + b(a - 1) Next Cells(処理業, 30) = c a = 0 c = 0 Next 処理業 End Sub ただ計算する列の範囲をインプットボックスで入力した値 にしたい為以下のように改造しました。 Dim b(対象列) As Integerでエラーになります 配列には変数は使用できないのでしょうか? よろしくお願いします。 Sub 計算() '失敗 Dim a As Integer Dim c As Integer Dim b(対象列) As Integer’★ここでERRになる Dim 最終行 Dim 対象列 Dim 値列  対象列 = 22'インプットボックスで入力した値 値列 = 17 最終行 = Cells(Rows.Count, 1).End(xlUp).Row For 処理業 = 1 To 最終行 For a = 1 To (対象列 - 17) b(a - 1) = Cells(1, 値列) 値列 = 値列 + 1 Next 値列 = 17 For a = 1 To (22 - 値列) c = c + b(a - 1) Next Cells(処理業, 30) = c a = 0 c = 0 Next 処理業 End Sub

  • Excelマクロ作成について教えて下さい

    Excelマクロ初心者のMJです。 Excel2007で、A列に製品名、B列から年月(YYYYMM)毎に2年分の販売数量が入力された表があり、この表の1行目の特定年月を指定して、その年月から12カ月分の全製品データを別シートにコピーをする方法を教えて下さい。 宜しくお願い致します。

  • EXCEL VBA マクロ 日付

    こんばんわ。 EXCEL VBA マクロ の日付について質問があります。 セル"A1"で"年"(例:2008)、セル"B1"で"月"(例:5)を指定します。 C1からC500くらいまで(毎日増えていきます)日付が入っています。 A1、B1で指定した年月と同じC列の日付を 10桁スラッシュ区切りの形式(例:2008/05/15)で 右隣のセル(D列)にコピーしたいんです。 困ったことにC列は形式が決まっているわけではありません。 たとえば、2008年5月15日の場合、 ・20080515・2008年5月15日・2008.05.15・2008.5.15 ・2008/05/15・2008/5/15・08/05/15・2008-5-15 その他、いろいろ考えられます。 これをマクロでやるにはどうすればいいでしょうか。 毎月一回実行します。 日付の形式をチェックするところで やり方がわからなくて困っています。 よろしくお願いします。

  • エクセルマクロで比較して消去したり 残したりを

    皆様よろしくお願いします。 1行目にタイトルが入っています。 A列とB列にそれぞれ数字が入っていて その数字を比較してアル規則に基づいて 列をずらしたり 消したりしたいのです、 A   B 2   1 4   2 5   3 6   5    を A   B 2   2 5   5  こういう結果にしたいのです。 A列にもB列にも数字が小さいほうから大きいほうに 並んでいて それぞれ同じ数字もあれば欠番もあります (隙間無く並んでます) 同じ行で比較して同じ数字であればそのまま残し 違っていれば上にずらして比べて・・・ という作業です。ちなみにデータ数はAが2000ほど Bが50000ほどです。 なにか良い方法があればお願いいたします。

  • エクセルのマクロで

    エクセルのマクロでこんな処理はできるでしょうか? 元データ表に A列からC列まである数値が5000行にわたって入っています。 例     A B C 1行目 1 4 6 2行目 4 7 8 3行目 5 6 4 4行目 7 8 2 ・ ・ 今、1行目と2行目の間に新たな行を挿入し、 C1セルの値を新たに挿入した行のA列からC列に貼り付けたい。 同様に現時点での2行目と3行目の間に新たな行を挿入し 今度はC2セルの値をその行に貼り付けます。 上の例で言うとこうなります。これを最後の行まで繰り返します。     A B C 1行目 1 4 6 2行目 6 6 6 3行目 4 7 8 4行目 8 8 8 5行目 5 6 4 6行目 4 4 4 7行目 7 8 2 8行目 2 2 2 ・ ・ 元データは5000行あるので、都合1万行になるということです。 このような処理はできるでしょうか? お教えいただけたら幸いです。よろしくお願いします。

  • Excelマクロ、特定行の削除

    A列に日付か文字のどちらかが入力してある表があります。  A列(日付文字) B列(時刻) C列以下(その他データ ) 日付は全て同じ日付(11月11日なら全部これ)で、文字も全て同じ文字です。 日付またはB列が時刻(さまざまな数値)の行を削除して、A列が文字の行だけ残したいのです。 Range("2:2").Select Selection.Delete Shift:=xlUp これを表範囲で繰り返すのはわかります。 "2:2"の所に変数を用いると思いますが、変数に日付の行を指定したりするコードが分かりません。 A列が文字の行を検索し、それ以外の行を削除でもよいのですよね。 よろしくお願いします。

  • エクセルマクロFor Eachの処理が長い

    エクセル2013です。 皆さんに教えていただいて以下のマクロが完成しました。 サンプルデータ 30行、7列ではあっという間に処理ができたのですが 本番環境 800行、50列ですと 処理時間が長く 青丸がくるくる回っていて、2分後にくらいで終わります。 もう少し早く処理する方法はありますでしょうか? Findで検索して、一括削除? (それはマクロでできるのでしょうか?) よろしくお願いします。 Sub 出荷済削除() Dim 対象セル As Range Dim 対象色 As Long Dim 対象色2 As Long Dim 最終行 Dim 最終列 最終列 = Cells(8, Columns.Count).End(xlToLeft).Column '8行目の最終列を取得 最終行 = Cells(Rows.Count, 1).End(xlUp).Row 'A列の最終行を取得 Application.ScreenUpdating = False '画面切替停止 対象色 = Range("B8").Interior.Color 'セルB8の色を基準色とする 対象色2 = Range("A8").Interior.Color 'セルB8の色を基準色とする For Each 対象セル In Range(Cells(10, 17), Cells(最終行, 最終列)) If 対象セル.Interior.Color = 対象色 Or 対象セル.Interior.Color = 対象色2 Then 対象セル.ClearContents Next 対象セル Application.ScreenUpdating = True '画面切替停止解除 End Sub

専門家に質問してみよう