見出し画像

行を削除するときの処理速度を上げる方法【EXCEL_VBA】

EXCEL VBAで行を削除するときの処理速度を上げる方法について紹介したいと思います。

処理速度を上げる方法はネットで検索すると、画面更新を非表示にするscreenupdatingプロパティや、コピーや貼付けではなくvalueプロパティを使用する方法などが記事に上がってます。

今回は、上記以外で大量に行を削除したいときに効果的な方法を紹介します。


下記のリストがあるとします。

リスト


一番下の行に合計金額を表示しています。
売上セル(列D)が空白の行を削除したいときの高速化手順です。
10,000行で試してみます。

まず、一般的な方法から

Sub 一行ずつ削除()

'timer関数で処理時間測定'
Dim start_time As Single
Dim stop_time As Single
start_time = Timer

With ThisWorkbook.Sheets("sheet1")

'リストの最下行特定'
Dim end_row As Long
end_row = .Cells(Rows.Count, "D").End(xlUp).Row

Dim i As Long
For i = end_row To 2 Step -1
   '空白行が見つかるたびに行を削除'
   If .Cells(i, "D") = "" Then
       .Rows(i).Delete
   End If
Next i
End With

stop_time = Timer
Debug.Print (stop_time - start_time)

End Sub

if文で空白を見つけて、1行ずつ削除していく方法です。
結果は、21.6秒でした。


そして、劇的に速度を上げる方法が以下のコードです。

Sub 一括削除()

'timer関数で処理時間測定'
Dim start_time As Single
Dim stop_time As Single
start_time = Timer


With ThisWorkbook.Sheets("sheet2")
'リストの最下行特定'
Dim end_row As Long
end_row = .Cells(Rows.Count, "D").End(xlUp).Row


Dim myrange As Range

Dim i As Long
For i = end_row To 2 Step -1
   If .Cells(i, "D") = "" Then
      '最初の空白行のときのみ 変数初期化'
       If myrange Is Nothing Then
           Set myrange = .Rows(i)
       Else
          'unionメソッドでmyrangeオブジェクトへ格納していく'
           Set myrange = Union(myrange, .Rows(i))
       End If
   End If
Next i

'一括削除'
myrange.Delete

End With

stop_time = Timer
Debug.Print (stop_time - start_time)

End Sub


unionメソッド
を使用します。
売上セルで空白行が見つかったら、削除せずにunionメソッドでrangeオブジェクトに一旦格納します。

そして、最後に一括削除を試みています。

結果は、0.8秒!

行を削除する処理を一回だけにすることが速度向上の鍵です。

もしよかったら試してみてください。

この記事が気に入ったらサポートをしてみませんか?