描画を停止し、まとめて列削除をする
大量の列を削除する場合、処理時間が遅いことがあります。
その場合は、「描画の停止」と「列をまとめて削除する」ことで高速化が可能です。
列削除で時間がかかる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 deleteColumns As Range '削除対象の列を格納する変数 '▽描画を停止する----- Application.ScreenUpdating = False With ws '1~2000列目を順番に判定し、1行目のセルの値が×の場合に列削除する For i = 1 To 2000 'Unionメソッドで、削除対象の列をdeleteColumnsにどんどん格納していく If .Cells(1, i).Value = "×" Then If deleteColumns Is Nothing Then Set deleteColumns = .Columns(i) Else Set deleteColumns = Union(deleteColumns, .Columns(i)) End If End If Next i End With '削除対象の列が格納されていたら、一括削除する If Not deleteColumns Is Nothing Then deleteColumns.EntireColumn.Delete End If '▽描画を再開する----- Application.ScreenUpdating = True |
解説
サンプルコードでは、対象のシートをws変数に格納し、格納したシートを処理対象としています。
繰り返し処理の中で、1列目から2000列目を順番にチェックします。
最初に削除対象の列が見つかった時は、deleteColumns変数に列を格納し、2件目以降の削除対象の列が見つかった時はUnionメソッドでどんどん格納しています。
UnionメソッドでdeleteColumns変数に、つなげていってるイメージです
最後に、削除対象の列があったらEntireColumn.Deleteで、列をまとめて一括削除します。
EntireColumn.Deleteなど列削除の方法については下の記事を見てください。
【VBA】列を削除する(1列だけ、連続した複数列、離れた複数列)
(参考)高速化してないコード
高速化せずに、普通に書いたプログラムは次のようになります。
特に処理時間に問題ない時は、この高速化していないこのコードの方が見やすいので、この書き方で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行目のセルの値が×の場合に列削除する For i = 2000 To 1 Step -1 If .Cells(1, i).Value = "×" Then .Columns(i).Delete End If Next i End With |
このコードのように、1列ずつ削除する場合は、後ろの列からループ処理で削除していきます。
詳しい理由は、次の記事を参考にしてください。