Excel VBA | 超初心者(Excel操作+マクロ体験):Excelオブジェクト基礎 - Columns

Excel VBA VBA
スポンサーリンク

Columns は「列そのもの」をまとめて扱うための入り口

まずイメージからいきます。
Rows が「行単位(横一列)」を扱うのに対して、
Columns は「列単位(縦一列)」をまとめて扱うためのオブジェクトです。

A 列全体(A1, A2, A3, …)
C 列全体(C1, C2, C3, …)
B~E 列全体

といった「縦一列」を触りたいときに、Columns が登場します。

Workbook → Worksheet → Columns(列) → Cells(セル)
という階層をイメージできると、かなりスッキリします。


Columns の基本:特定の列を丸ごと触る

A 列を丸ごと指定する

一番シンプルな例からいきます。

Sub SampleColumnsBasic()

    Dim ws As Worksheet

    Set ws = ThisWorkbook.Worksheets("入力")

    ws.Columns(1).Interior.Color = vbYellow   ' A列を黄色に

End Sub
VB

ws.Columns(1) は、「入力シートの 1 列目(A 列)全体」を表す Range です。
列番号で指定しているので、1 → A 列、2 → B 列、3 → C 列… という対応になります。

列記号で指定することもできます。

ws.Columns("A").Interior.Color = vbYellow
VB

どちらも「A 列全体」を表します。

列全体を削除する・挿入する

Sub SampleColumnsDeleteInsert()

    Dim ws As Worksheet

    Set ws = ThisWorkbook.Worksheets("入力")

    ws.Columns("C").Delete    ' C列を削除
    ws.Columns("E").Insert    ' E列の位置に新しい列を挿入

End Sub
VB

列単位で削除・挿入したいときは、Columns(“列記号”).Delete / Insert が素直で分かりやすいです。


「どのシートの Columns か」を必ず書く

Columns だけで書くと“アクティブシート依存”になる

いきなりこう書くこともできます。

Columns("A").Interior.Color = vbYellow
VB

これは「アクティブなシートの A 列」を意味します。
一見楽ですが、「どのシートがアクティブか」によって対象が変わるので、バグの元です。

超初心者のうちから、必ずこう書く癖をつけてください。

ws.Columns("A").Interior.Color = vbYellow
VB

どのシートか → ws(Worksheet 変数)
その上の Columns(“A”) → A 列

という「ブック → シート → Columns」という順番を崩さないのが大事です。


複数列をまとめて扱う

A~D 列を一気に指定する

Sub SampleColumnsMulti()

    Dim ws As Worksheet

    Set ws = ThisWorkbook.Worksheets("入力")

    ws.Columns("A:D").Interior.Color = vbYellow

End Sub
VB

Columns(“A:D”) は、「A 列から D 列まで全部」を表す Range です。
行のときに Rows(“1:10”) と書いたのと同じ感覚で、列は “A:D” のように書きます。

もちろん、削除や挿入もできます。

ws.Columns("B:C").Delete   ' B~C列をまとめて削除
VB

列番号を変数で動かす

列番号で指定する場合は、数字をそのまま渡せます。

Sub SampleColumnsVariable()

    Dim ws As Worksheet
    Dim startCol As Long
    Dim endCol As Long
    Dim c As Long

    Set ws = ThisWorkbook.Worksheets("入力")

    startCol = 2   ' B列
    endCol = 5     ' E列

    For c = startCol To endCol
        ws.Columns(c).Interior.Color = vbYellow
    Next c

End Sub
VB

ここでは、B~E 列をループで順番に黄色にしています。
列記号ではなく「列番号」で持てるようになると、ループ処理と相性がよくなります。


Columns と Cells を組み合わせて「列を走査する」

各列の特定行だけを見る

Columns は「列全体」を表しますが、
実際の処理では「各列の特定行だけを見る」ことが多いです。
そのときに、Columns と Cells を組み合わせると分かりやすくなります。

Sub SampleColumnsLoop()

    Dim ws As Worksheet
    Dim lastCol As Long
    Dim c As Long

    Set ws = ThisWorkbook.Worksheets("入力")

    lastCol = ws.Cells(1, ws.Columns.Count).End(xlToLeft).Column   ' 1行目の最終列

    For c = 1 To lastCol
        If ws.Cells(1, c).Value = "" Then
            ws.Columns(c).Interior.Color = vbYellow   ' 見出しが空の列を黄色に
        End If
    Next c

End Sub
VB

ここでやっていることは、

1 行目の最終列を求める
1 列目から最終列までループする
各列の 1 行目が空なら、その列全体を黄色にする

という流れです。

重要なのは、

「列を動かす変数 c」
「その列の特定行を見る Cells(行, c)」
「列全体を触る Columns(c)」

という役割分担を意識することです。


Columns を使うときに意識してほしい重要ポイント

「列全体を触りたいのか」「列の中の一部だけ触りたいのか」を意識する

Columns(“C”) は「C 列全体」です。
背景色を変える・列ごと削除する・列ごと挿入する、といった「列単位の操作」に向いています。

一方で、「C 列の 3 行目だけ」「C 列の 2~10 行目だけ」といった場合は、
Cells や Range を使う方が自然です。

C 列全体 → ws.Columns(“C”)
C 列の 3 行目 → ws.Cells(3, 3)
C 列の 2~10 行目 → ws.Range(“C2:C10”)

という使い分けを意識すると、コードが読みやすくなります。

必ず「どのシートの Columns か」を書く

もう一度強調しますが、

Columns("C").Delete
VB

のような書き方は、アクティブシートに依存してしまいます。

ThisWorkbook.Worksheets("入力").Columns("C").Delete
VB

あるいは

ws.Columns("C").Delete
VB

のように、「ブック → シート → Columns」という順番を守る書き方を、
超初心者のうちから体に染み込ませておくと、後で本当に楽になります。


まとめ:Columns は「列単位でシートを扱うためのハンドル」

Columns の本質は、

「シート上の列を、1列または複数列まとめて扱うためのオブジェクト」

です。

押さえておきたいポイントをコンパクトにまとめると、

ws.Columns(1) や ws.Columns(“A”) は「そのシートの A 列全体」を表す Range
Columns(“A:D”) のように書くと、複数列をまとめて指定できる
列番号を変数で持ち、Cells(行, c) と Columns(c) を組み合わせると“列を走査する”処理が書きやすい
必ず「どのシートの Columns か」を明示して、アクティブシート依存を避ける

VBAVBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました