| 
    
     |  | ▼勉強中さっち さん: >>毎回削除するのではなく、最後にまとめて削除するように改良するだけでも
 >>格段の進歩ですよ (^^
 >
 >そうですね。
 >まとめて削除するなら、削除行をまとめる入れ物作成して、最終的に
 >入れ物.DELETEとすれば、いけますよね。
 >配列を設定して、ReDim Preserveで格納されている削除行を失わなければ
 >最終的に一撃で削除できますよね?
 >
 >その方が、処理速度があがるのでしょうか?
 
 
 スピード実験してみました
 
 テストは 「Org」という5100行×8列 の表の入ったシートを、コピーして
 コピーシートの方で、方法による処理スピードをテストしたものです。
 
 'まず、下から対象行を一行づつ削除する方法
 Sub Test1_Del_OnDemand()
 
 '範囲をソートする
 Worksheets("Org").Copy After:=Sheets(Sheets.Count)
 Range("A1").CurrentRegion.Sort Key1:=[A2], Key2:=[B2], Header:=xlYes
 
 Dim t!: t = Timer
 Dim rr As Range
 Dim i As Long, k As Long
 Dim LastRow As Long
 Dim v
 Application.ScreenUpdating = False '/ True
 LastRow = [A65536].End(xlUp).Row
 v = Range("A1:B" & LastRow).Value2
 For i = LastRow To 2 Step -1
 If v(i - 1, 1) = v(i, 1) Then   'A列が上下同じデータで、
 If v(i - 1, 2) = v(i, 2) Then  'かつ、B列も上下同じなら、
 Rows(i).Delete      'ただちに 行削除を実行
 k = k + 1
 End If
 End If
 Next
 Application.ScreenUpdating = True
 Debug.Print "'DEL_onDemand "; Timer - t; " ("; k; "行Delete"
 End Sub
 'この方法ですと、
 Application.ScreenUpdating = False '/ True で画面の更新制御をすると
 しないとでは、処理スピードに大きなさがあります。
 
 'DEL_onDemand 84.08594 秒 ( 5000 行Delete---- ScreenUpdatingなし
 'DEL_onDemand 19.78516  ( 5000 行Delete ----ScreenUpdating付き
 
 'この方法しかないときは、Application.ScreenUpdating = False '/ True
 による画面更新の抑止は必須です。
 しかし、もともとApplication.ScreenUpdating = False '/ True の効果が
 おおきいプログラムは シートにそれほど頻繁にアクセスしているという
 ことです。セルへのアクセスは極力抑えたコードを書き、
 Application.ScreenUpdating = False '/ True を使わなくても処理が効率
 よく遂行されるようなコーディングに心がけましよう。
 
 
 'Unionメソッドで 削除行を変数にまとめておき、最後に一括 行削除
 Sub Test2_Union()
 
 '範囲をソートする
 Worksheets("Org").Copy After:=Sheets(Sheets.Count)
 Range("A1").CurrentRegion.Sort Key1:=[A2], Key2:=[B2], Header:=xlYes
 
 Dim t!: t = Timer
 Dim rr As Range
 Dim i As Long
 Dim LastRow As Long
 Dim v
 LastRow = [A65536].End(xlUp).Row
 v = Range("A1:B" & LastRow).Value2
 For i = LastRow To 2 Step -1
 If v(i - 1, 1) = v(i, 1) Then   'A列が上下同じデータで、
 If v(i - 1, 2) = v(i, 2) Then  'かつ、B列も上下同じなら、
 '削除行を変数に格納
 If rr Is Nothing Then
 Set rr = Rows(i)
 Else
 Set rr = Union(rr, Rows(i))
 End If
 
 End If
 End If
 Next
 Debug.Print "'UnionRows "; Timer - t
 If Not rr Is Nothing Then
 rr.Delete
 End If
 End Sub
 
 こちらの環境では、'UnionRows 0.2851563秒 でした。
 
 |  |