ループ処理で、右側の列から1列ずつ判定し削除する
条件に一致する列だけを削除したい時は、ループ処理で1列ずつ判定し削除します
この時の大事なポイントは、先頭の列からではなく、最後の列から順番に処理をすることです。
先頭列から列削除がダメな理由
先頭列からループ処理で列削除を行うのがダメな理由は、先頭から列削除を行うと、列削除された列の分だけ列が左に詰まり、処理が何もされない列が発生してしまうからです。
わかりやすいように具体例で説明すると、先頭列から列の判定・削除を行っている時に5列目を削除したとします。
次にプログラムは6列目を判定・削除しようとするのですが、その時6列目にあるのは、プログラム開始時には7列目にあったデータです。(5列目が削除されたので、6列目以降は1列左に詰まってます)
そして、プログラム開始時に6列目にあったデータは5列目に移動してしまっているので、開始時に6列目にあったデータは列削除の判定・削除が行われません。
列が削除された分だけ列が左に詰まって、判定されない列が発生するってことです。
コード
サンプルコードでは、1~100列で1行目の値が×だったら、その列を削除します。
1 2 3 4 5 6 7 8 9 10 |
Dim i As Long '1~100列目を順番に判定し、1行目のセルの値が×の場合に列削除する For i = 100 To 1 Step -1 If Cells(1, i).Value = "×" Then Columns(i).Delete End If Next i |
解説
繰り返し処理のForでは、カウンタ変数iの初期値を100としStep -1としているので、処理を繰り返すごとにカウンタ変数iがマイナス1されていきます。
このカウンタ変数iを使って処理する列を指定しているので、実際の動きとしては100列目、99列目、98列目…1列目と右側の列から順番に判定・削除処理が行われます。
列削除の基本や、その他の応用テクニックは下の記事を見てください。
【VBA】列を削除する(1列だけ、連続した複数列、離れた複数列)