空白セルがある列をすべて削除する方法は、「ループ処理で1列ずつチェックしながら削除する方法」と、「SpecialCellsメソッドで空白セルを取得し、一括削除する方法」があります。
複雑なロジックも行いたい場合は「ループ処理で1列ずつチェックしながら削除する方法」、処理速度を重視するなら「SpecialCellsメソッドで空白セルを取得し、一括削除する方法」がオススメです。
ループ処理で1列ずつチェックしながら削除する方法
削除の対象となる列の範囲を、1列ずつループ処理でチェックします。
空白セルだった場合に、Deleteメソッドでその列を削除します。
コード
サンプルコードでは、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 |
解説
繰り返し処理で、後ろの列(100列目)からしているのが大事なポイントです。
1番最後の列から削除をしないで先頭の列から削除をすると、削除した列が左に詰まり、処理されない列が発生するからです。
もう少し詳しく知りたい場合は、次の記事を参考にしてください。
SpecialCellsメソッドで空白セルを取得し、一括削除する方法
まず、RangeオブジェクトのSpecialCellsメソッドを使って、Rangeで指定した範囲の空白セルを取得します。(SpecialCellsメソッドxlCellTypeBlanksを指定すると、空白セルが取得できます。)
SpecialCellsメソッドは、空白セルや数式が含まれるセルなど特定のセルを取得できる便利なメソッドです。
その後、EntireColumn.Deleteでまとめて削除します。
EntireColumnは、指定したセル(今回は空白セル)の列全体を取得するので、それに対してDeleteメソッドを使うとまとめて削除できます。
コード
サンプルコードでは、A~Z列目をチェックし、1行目の値が空白だった時にその列を削除します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
'空白セルが存在する列(セル)を格納する変数 Dim deleteColumnCells As Range 'エラーを無視する On Error Resume Next 'A列~Z列で1行目が空白のセルを取得します Set deleteColumnCells = Range("A1:Z1").SpecialCells(xlCellTypeBlanks) '取得したセルをまとめて削除 deleteColumnCells.EntireColumn.Delete |
解説
SpecialCellsで空白セルを取得するのですが、0件の時はエラーが発生します。(そういう仕様なのです)
なので、まず処理前にOn Error Resume Nextと書くことで、エラーを無視するようにします。
その後、deleteColumnCells変数に、1行目が空白のセルをすべて格納します。
最後にdeleteColumnCells.EntireColumn.Deleteでまとめて列削除しています。
たとえば、1~3行目どこか1箇所でも空白が存在する列を削除したい場合は、空白セルを取得する時の範囲を
Set deleteColumnCells = Range(“A1:Z3“).SpecialCells(xlCellTypeBlanks)
と変更すればOKです。
列削除の基本や、その他の応用テクニックは下の記事を見てください。
【VBA】列を削除する(1列だけ、連続した複数列、離れた複数列)