特定文字を含む列をすべて削除する方法は、「InStr関数で調べ削除する方法」と「Findメソッドで対象セルを取得し削除する方法」があります。
どちらも1件ずつ処理をするのは変わらないですが、複雑な条件の場合は「InStr関数で調べ削除する方法」の方がコーディングがしやすいです。
InStr関数で調べ削除する方法
削除の対象となる列の範囲を、1列ずつループ処理でチェックします。
特定の文字を含むかはInStr関数を使ってチェックし、含んでいるセルの時にその列を削除します。
InStr関数は、セルに指定した文字が存在する時には1以上の値、存在しない時は0を返します。
コード
サンプルコードでは、1~100列目をチェックし、1行目の値に「2021年」を含んでいた時にその列を削除します。
1 2 3 4 5 6 7 8 9 10 |
Dim i As Long '1~100列目を順番に判定し、1行目のセルに「2021年」を含んでいた時にその列を削除します。 For i = 100 To 1 Step -1 If InStr(Cells(1, i).Value, "2021年") >= 1 Then Columns(i).Delete End If Next i |
解説
繰り返し処理で、後ろの列(100列目)からしているのが大事なポイントです。
1番最後の列から削除をしないで先頭の列から削除をすると、削除した列が左に詰まり、処理されない列が発生するからです。
もう少し詳しく知りたい場合は、次の記事を参考にしてください。
Findメソッドで対象セルを取得し削除する方法
ループ処理の中で、RangeオブジェクトのFindメソッドを使って、Rangeで指定した範囲の中から指定した文字を含むセルを取得します。
この時、名前付き引数で「部分一致(指定した文字を含む)」を意味するLookAt:=xlPartを書きます。
対象となるセルがある間はループ処理で列の削除処理を行い、対象セルがなくなった(見つからなくなった)らループ処理を抜けます。
「完全一致」で検索したい場合は、LookAt:=xlWhole と書きます。
EntireColumnは、指定したセル(今回は特定の文字を含むセル)の列全体を取得するので、それに対してDeleteメソッドを使うと列を削除できます。
コード
サンプルコードでは、A~Z列目をFindメソッドでチェックし、1行目の値に「2021年」を含んでいた時にその列を削除します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
'空白セルが存在する列(セル)を格納する変数 Dim deleteColumnCell As Range Do 'A列~Z列で、1行目のセルに「2021年」を含んでいるセルを格納します Set deleteColumnCell = Range("A1:Z1").Find(What:="2021年", LookAt:=xlPart) '指定した文字を含むセルがない、または全て削除し終わった時にループを抜けます。 If deleteColumnCell Is Nothing Then Exit Do End If '列を削除します deleteColumnCell.EntireColumn.Delete Loop |
解説
大事なポイントとしては、繰り返し処理でDo Loopを使っているところです。
終了条件を書かないと無限ループになって処理が終わらないので、終了条件(今回は特定の文字を含むセルがなくなった)を必ず書きましょう。
InStrを使った削除の方が、正直見やすいし安全かなぁと個人的には思います。
列削除の基本や、その他の応用テクニックは下の記事を見てください。
【VBA】列を削除する(1列だけ、連続した複数列、離れた複数列)