目次

複数列を一括で削除

今回の投稿では、 Excel ワークシートの連続していない複数列一括で削除するマクロを作成してみました。

下の画像のワークシートの「B」「D」「F」列を一度に削除してみたいと思います。

複数列を一括で削除。 B , D , F 列を一括で削除する。
複数列を一括で削除。 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

目次まで戻る

テスト環境

  • Windows 10
  • Microsoft Office Excel 2003

目次まで戻る

あとがき

EntireColumn プロパティで、列を一括指定できるのは便利ですね。セル範囲が複数ある場合は、複数のエリアが存在しているようですね。

複数のエリアのイメージ図です。
複数のエリアのイメージ図です。

以上、閲覧ありがとうございました。

目次まで戻る

同じカテゴリの投稿(Excel VBA)

前後の投稿