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
VBws.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
VBColumns(“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 か」を明示して、アクティブシート依存を避ける
