はじめに
Excel VBAには、ColumnとColumns、RowとRowsというよく似た名前のプロパティがあります。名前は似ていますが、役割は同じではありません。
ColumnとRowは、指定したRange(セルまたはセル範囲)がワークシート上の何列目・何行目から始まるかを番号で返すプロパティです。一方、ColumnsとRowsは、指定範囲の列や行をRangeとして扱うために使います。
この記事では、この違いを比較表とコード例で整理します。読み終えるころには、「番号が欲しいのか」「セル範囲を操作したいのか」を基準に、4つを使い分けられるようになります。
Column・RowとColumns・Rowsの違い
最初に、4つの役割を表で整理します。
| プロパティ | 主な役割 | 返り値 | 例 |
|---|---|---|---|
Column | Rangeの先頭列番号を取得する | Long型の数値 | Range("B3").Column → 2 |
Row | Rangeの先頭行番号を取得する | Long型の数値 | Range("B3").Row → 3 |
Columns | Range内の列をRangeとして扱う | Rangeオブジェクト | Range("B2:C5").Columns(1) → B2:B5 |
Rows | Range内の行をRangeとして扱う | Rangeオブジェクト | Range("B2:C5").Rows(1) → B2:C2 |
違いの中心は、Column・Rowは番号を返し、Columns・Rowsはセル範囲を返すことです。
複数形だから必ず複数の列・行を返すわけではありません。たとえばColumns(1)は、対象Rangeの1列目を1つのRangeとして返します。
ColumnとRowは列番号・行番号を返す
ColumnとRowは、セルやセル範囲の列番号・行番号を数値として取得したいときに使います。
Dim colNo As Long
Dim rowNo As Long
colNo = Range("B3").Column
rowNo = Range("B3").Row
この例では、B列は2列目なのでcolNoは2、3行目なのでrowNoは3になります。
対象が複数セルのRangeでも考え方は同じです。
Debug.Print Range("B2:C5").Column ' 2
Debug.Print Range("B2:C5").Row ' 2
Range("B2:C5")はB2から始まるため、Columnは2、Rowも2を返します。つまり、Rangeに含まれる列数や行数ではなく、そのRangeがどこから始まるかを確認するためのプロパティです。
行番号・列番号の取得や、Endプロパティを組み合わせた最終行・最終列の考え方は、Excel VBA Row Column:行 列番号を取得で詳しく解説しています。
ColumnsとRowsは列・行をRangeとして返す
ColumnsとRowsは、番号を調べるのではなく、対象範囲の列や行そのものを操作したいときに使います。
たとえば、Range("B2:C5")の1列目を取得する場合は次のように書けます。
Dim firstColumn As Range
Set firstColumn = Range("B2:C5").Columns(1)
firstColumn.Value = 0
このfirstColumnはB2:B5を表すRangeです。同じように、1行目を取得する場合はRows(1)を使います。
Dim firstRow As Range
Set firstRow = Range("B2:C5").Rows(1)
firstRow.Font.Bold = True
この場合、firstRowはB2:C2を表します。
また、Countを組み合わせると、対象Rangeに含まれる列数・行数を取得できます。
Dim colCount As Long
Dim rowCount As Long
colCount = Range("B2:C5").Columns.Count ' 2
rowCount = Range("B2:C5").Rows.Count ' 4
Columns・Rowsを使ったRange操作やCount、CurrentRegionによる範囲取得は、VBA Rows Columns:範囲内の行列数を自動で取得で詳しく扱っています。
Column・RowとColumns・Rowsの使い分け
迷ったときは、欲しい結果が「番号」か「セル範囲」かで判断すると分かりやすくなります。
- セルが何列目か知りたい →
Column - セルが何行目か知りたい →
Row - 指定範囲の列を操作したい →
Columns - 指定範囲の行を操作したい →
Rows - 指定範囲に何列あるか数えたい →
Columns.Count - 指定範囲に何行あるか数えたい →
Rows.Count
たとえば、「B3セルは何列目か」を調べるならRange("B3").Columnです。「B2:C5の1列目へ値を入れる」ならRange("B2:C5").Columns(1)を使います。
このように、位置を数値で知りたい場合は単数形、列や行をRangeとして扱いたい場合は複数形と整理すると、コードの意味を判断しやすくなります。
よくある混同
ColumnsやRowsは「複数列・複数行専用」ではない
ColumnsやRowsという複数形だけを見ると、複数の列や行をまとめて扱う機能に見えます。しかし、Columns(1)やRows(1)のように、対象範囲から1列・1行だけをRangeとして取得することもできます。
重要なのは数ではなく、返り値がRangeであることです。
ColumnやRowは範囲内の列数・行数を返すわけではない
Range("B2:C5").Columnは、2列分あるから2を返すのではありません。B列から始まっているため2を返します。
範囲内の列数を知りたい場合はRange("B2:C5").Columns.Count、行数を知りたい場合はRange("B2:C5").Rows.Countを使います。
対象となるRangeを明示すると意図が分かりやすい
ColumnsやRowsは、どのRangeを基準にするかで対象が変わります。初学者のうちは、Range("B2:C5").Columns(1)のように基準となるRangeを明示すると、どの列・行を操作しているのか読み取りやすくなります。
まとめ
Column・RowとColumns・Rowsは、名前は似ていますが返すものが異なります。
Column:Rangeの先頭列番号を返すRow:Rangeの先頭行番号を返すColumns:列をRangeとして返すRows:行をRangeとして返す
使い分けるときは、番号が欲しいのか、セル範囲を操作したいのかを基準にすると判断しやすくなります。
行番号・列番号そのものを詳しく扱いたい場合はColumn・Rowの記事、Range内の列・行操作や件数取得を詳しく扱いたい場合はColumns・Rowsの記事へ進むと、役割の違いを保ったまま理解を深められます。