私は、EXCELでは、ワークシートのデータを別シートにデータベースとして保存していくマクロをよく使います。
その時、ある項目(例えば日付)について重複するデータがあればメッセージボックスで上書き可否を問いかけ、可なら上書きするのですが、その場合、まず、重複する行を削除する必要があります。
行数が多い場合、1行ずつ判定して行削除(EntireRow.Delete)していくのは時間がかかりますので、まずは削除対象をすべてRangeオブジェクトに格納して、EntireRow.Deleteを一度で済ませると格段に早くなります。
以下は、A列に日付が入っているワークシート(Sheet1)の2行目から最終行までをループし、A列セルが開始日(2017/3/16)から終了日(2018/3/15)の期間内の日付である行を削除するコードです。
Option Explicit '###### 期間内行削除 ###### Sub delete_Row() Dim lRow As Long '最終行を見つけるための変数 Dim delArea As Range '削除対象のRangeオブジェクトを格納する変数 Set delArea = Nothing 'オブジェクトへの参照を解除 Dim ws As Worksheet Set ws = Worksheets("Sheet1") '対象ワークシート Dim startDate As Date '期間開始日 startDate = DateSerial(2017, 3, 16) Dim endDate As Date '期間終了日 endDate = DateSerial(2018, 3, 15) lRow = ws.Cells(Rows.Count, 1).End(xlUp).row 'A列最終行 Dim Rng As Range '削除対象を見つけるための変数 For Each Rng In Range(Cells(2, 1), Cells(lRow, 1)) '削除対象検索の範囲(A列日付) '期間開始日とセル値の差が0日以上(セル値が期間開始日以上)かつ、 '期間終了日とセル値の差が0日以下(セル値が期間終了日以下)の場合 If DateDiff("d", startDate, Rng.Value) >= 0 And DateDiff("d", endDate, Rng.Value) <= 0 Then If delArea Is Nothing Then Set delArea = Rng '削除対象セルを格納 Else Set delArea = Union(delArea, Rng) '次の削除対象セルを併せて格納を繰り返す End If End If Next If Not delArea Is Nothing Then Application.ScreenUpdating = False '画面更新を停止 Application.EnableEvents = False 'イベント発生を停止 delArea.EntireRow.Delete '行削除 Application.EnableEvents = True 'イベント発生再開 Application.ScreenUpdating = True '画面更新再開 End If End Sub
上記はFor Each文を使っていますが、For Next文だと下記のようになります。
Option Explicit '###### 期間内行削除その2 ###### Sub delete_Row2() Dim lRow As Long '最終行を見つけるための変数 Dim delArea As Range '削除対象のRangeオブジェクトを格納する変数 Set delArea = Nothing 'オブジェクトへの参照を解除 Dim ws As Worksheet Set ws = Worksheets("Sheet1")'対象ワークシート Dim startDate As Date '期間開始日 startDate = DateSerial(2017, 3, 16) Dim endDate As Date '期間終了日 endDate = DateSerial(2018, 3, 15) Dim r As Long '削除対象行を見つけるための変数 lRow = ws.Cells(Rows.Count, 1).End(xlUp).row 'A列最終行 For r = lRow To 2 Step -1 '最終行から2行目までループ 'セル値が期間開始日以上、かつ、期間終了日以下の場合 If ws.Cells(r, 1).Value >= startDate And ws.Cells(r, 1).Value <= endDate Then If delArea Is Nothing Then Set delArea = ws.Cells(r, 1) '削除対象セルを格納 Else Set delArea = Union(delArea, ws.Cells(r, 1)) '次の削除対象セルを併せて格納を繰り返す End If End If Next r If Not delArea Is Nothing Then Application.ScreenUpdating = False '画面更新を停止 Application.EnableEvents = False 'イベント発生を停止 delArea.EntireRow.Delete Application.EnableEvents = True 'イベント発生再開 Application.ScreenUpdating = True '画面更新再開 End If End Sub
以上、ご参考になれば幸いです。
コメント