描画を停止し、まとめて行削除をする
大量の行を削除する場合、処理時間が遅いことがあります。
その場合は、「描画の停止」と「行をまとめて削除する」ことで高速化が可能です。
行削除で時間がかかる1番の理由は、1つずつ行を削除する処理だからです。
一般的な書き方に比べ、今回の高速化で処理時間は10分の1以下にはなると思います。
「描画の停止」をするには、処理の前にApplication.ScreenUpdating = Falseと書きます。
その後、すべての処理が終わったらApplication.ScreenUpdating = Trueで描画するように戻せば、実行結果がエクセルに反映されます。
「行をまとめて削除する」には、Range変数に削除対象の行をどんどんUnionメソッドで格納し、最後にまとめて行を削除します。
コード
サンプルコートは、「社員情報」ブックの「住所」シート1~2000行目で、1行目の値が×の行をすべて削除します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
'削除対象のシートを設定 Dim ws As Worksheet Set ws = Workbooks("社員情報.xlsx").Worksheets("住所") Dim i As Long Dim deleteRows As Range '削除対象の行を格納する変数 '▽描画を停止する----- Application.ScreenUpdating = False With ws '1~2000行を順番に判定し、1列目(A列)のセル値が×の場合に行削除する For i = 1 To 2000 'Unionメソッドで、削除対象の行をdeleteRowsにどんどん格納していく If .Cells(i, 1).Value = "×" Then If deleteRows Is Nothing Then Set deleteRows = .Rows(i) Else Set deleteRows = Union(deleteRows, .Rows(i)) End If End If Next i End With '削除対象の行が格納されていたら、一括削除する If Not deleteRows Is Nothing Then deleteRows.EntireRow.Delete End If '▽描画を再開する----- Application.ScreenUpdating = True |
解説
サンプルコードでは、対象のシートをws変数に格納し、格納したシートを処理対象としています。
繰り返し処理の中で、1行目から2000行目を順番にチェックします。
最初に削除対象の行が見つかった時は、deleteRows変数に行を格納し、2件目以降の削除対象の行が見つかった時はUnionメソッドでどんどん格納しています。
UnionメソッドでdeleteRows変数に、つなげていってるイメージです
最後に、削除対象の行があったらEntireRow.Deleteで、行をまとめて一括削除します。
EntireRow.Deleteなど行削除の方法については下の記事を見てください。
(参考)高速化してないコード
高速化せずに、普通に書いたプログラムは次のようになります。
特に処理時間に問題ない時は、この高速化していないこのコードの方が見やすいので、この書き方でOKです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
'削除対象のシートを設定 Dim ws As Worksheet Set ws = Workbooks("社員情報.xlsx").Worksheets("住所") Dim i As Long With ws '1~2000行を順番に判定し、1列目(A列)のセル値が×の場合に行削除する For i = 2000 To 1 Step -1 If .Cells(i, 1).Value = "×" Then .Rows(i).Delete End If Next i End With |
このコードのように、1行ずつ削除する場合は、後ろの行からループ処理で削除していきます。
詳しい理由は、次の記事を参考にしてください。