目次
複数列を一括で削除
今回の投稿では、 Excel ワークシートの連続していない複数列を一括で削除するマクロを作成してみました。
下の画像のワークシートの「B」「D」「F」列を一度に削除してみたいと思います。

マクロの一例
早速、以下のマクロのコードを書いてみました。
「Range」プロパティで複数のセルを指定、そのセルを含む複数の列を取得、取得した複数の列を削除する、という流れのマクロになっています。
Sub 連続していない複数列を一括で削除するマクロ()
Range("B1,D1,F1").EntireColumn.Delete
End Sub
上のマクロを以下のワークシート上で実行してみます。シートの 1 行目に A ~ G の文字が入力されています。
「B」「D」「F」列を削除すると、「A」「C」「E」「G」の文字が残るはずですね。

マクロを実行すると、以下の画像のように「B」「D」「F」列が削除されました。 A , B , C , D , E , F , G から B , D , F が削除されて A , C , E , G が残っていますね。
複数列の一括削除に成功したようです。

ドットで区切る
上記のマクロで、「Range("B1,D1,F1").EntireColumn.Delete」の一文を記述しましたが、途中のドットで区切って見た場合、 Range プロパティ、 EntireColumn プロパティが返すセル範囲の状態は、その時、どうなっているのでしょうか。
以下のマクロを作成して調べてみました。
まずは、 Range プロパティの途中の状態を調べるマクロを試してみたいと思います。
「Range("B1,D1,F1")」は、 3 つのエリアに分かれているので、「Areas.Count」でエリアの数を取得、「Areas.Item(n)」で n 番目のエリアのアドレスを取得しています。
「Debug.Print」の行の、シングルクォーテーション( ' )から始まるコメント文に、 Debug.Print メソッドの出力結果を記載してあります。
コメント文は、緑色の文字になっています。
Sub Rangeプロパティが返すオブジェクト()
Dim r As Range '変数 r を宣言。
Set r = Range("B1,D1,F1") '変数 r にセル範囲への参照をセット。
Debug.Print r.Address '結果 = $B$1,$D$1,$F$1
Debug.Print r.Address(ReferenceStyle:=xlR1C1) '結果 = R1C2,R1C4,R1C6
Debug.Print r.Cells.Count '結果 = 3
Debug.Print r.Areas.Count '結果 = 3
Debug.Print r.Areas.Item(1).Address '結果 = $B$1
Debug.Print r.Areas.Item(2).Address '結果 = $D$1
Debug.Print r.Areas.Item(3).Address '結果 = $F$1
Set r = Range("A1:C1,E1,G1") ’セル範囲の参照先を変更。
Debug.Print r.Address '結果 = $A$1:$C$1,$E$1,$G$1
Debug.Print r.Address(ReferenceStyle:=xlR1C1) '結果 = R1C1:R1C3,R1C5,R1C7
Debug.Print r.Cells.Count '結果 = 5
Debug.Print r.Areas.Count '結果 = 3
Debug.Print r.Areas.Item(1).Address '結果 = $A$1:$C$1
Debug.Print r.Areas.Item(2).Address '結果 = $E$1
Debug.Print r.Areas.Item(3).Address '結果 = $G$1
Set r = Nothing 'オブジェクトへの参照解除
End Sub
上のマクロを実行してみると、 VBE のイミディエイトウィンドウに以下の内容が出力されました。
「Areas.Count」の結果が「3」になっているので、 3 つのエリアが存在しているようです。
「Cells.Count」の結果は、各エリアのセル数を合計した値と同じになっています。
$B$1,$D$1,$F$1 'A1 形式
R1C2,R1C4,R1C6 'R1C1 形式
3 'セル個数
3 'エリア数
$B$1 '1 つ目のエリアのアドレス
$D$1 '2 つ目のエリアのアドレス
$F$1 '3 つ目のエリアのアドレス
$A$1:$C$1,$E$1,$G$1
R1C1:R1C3,R1C5,R1C7
5
3
$A$1:$C$1
$E$1
$G$1
次は、 EntireColumn プロパティの状態を見てみたいと思います。
上のコードにも使用していますが、「Address(ReferenceStyle:=xlR1C1)」の記述は、セル範囲を R1C1 形式の文字列で取得できるようです。
Sub EntireColumnプロパティが返すオブジェクト() Dim r As Range Set r = Range("B1,D1,F1").EntireColumn Debug.Print r.Address '結果 = $B:$B,$D:$D,$F:$F Debug.Print r.Address(ReferenceStyle:=xlR1C1) '結果 = C2,C4,C6 Debug.Print r.Cells.Count '結果 = 196608 Debug.Print r.Areas.Count '結果 = 3 Debug.Print r.Areas.Item(1).Address '結果 = $B:$B Debug.Print r.Areas.Item(2).Address '結果 = $D:$D Debug.Print r.Areas.Item(3).Address '結果 = $F:$F Set r = Range("A1:C1,E1,G1").EntireColumn Debug.Print r.Address '結果 = $A:$C,$E:$E,$G:$G Debug.Print r.Address(ReferenceStyle:=xlR1C1) '結果 = C1:C3,C5,C7 Debug.Print r.Cells.Count '結果 = 327680 Debug.Print r.Areas.Count '結果 = 3 Debug.Print r.Areas.Item(1).Address '結果 = $A:$C Debug.Print r.Areas.Item(2).Address '結果 = $E:$E Debug.Print r.Areas.Item(3).Address '結果 = $G:$G Set r = Nothing End Sub
上のマクロを実行してみると、以下のような結果になりました。
EntireColumn プロパティで列単位の範囲を取得しているので、結果を見てみても、列を指定する時の形式になっていますね。
セルの個数は、 Excel2003 の最大行数 65536 行 ✕ 3 の 196608 になっています。列単位で範囲を参照しているようです。
$B:$B,$D:$D,$F:$F 'A1 形式。列を指定する時の書式になっています。
C2,C4,C6 'R1C1 形式
196608 '65536行*3列
3 'エリア数
$B:$B 'B 列
$D:$D 'D 列
$F:$F 'F 列
$A:$C,$E:$E,$G:$G
C1:C3,C5,C7
327680
3
$A:$C
$E:$E
$G:$G