PR

VBAのColumn・RowとColumns・Rowsの違いとは?使い分けを解説

VBA Column・RowとColumns・Rows Excel
スポンサーリンク

はじめに

Excel VBAには、ColumnとColumns、RowとRowsというよく似た名前のプロパティがあります。名前は似ていますが、役割は同じではありません。

ColumnとRowは、指定したRange(セルまたはセル範囲)がワークシート上の何列目・何行目から始まるかを番号で返すプロパティです。一方、ColumnsとRowsは、指定範囲の列や行をRangeとして扱うために使います。

この記事では、この違いを比較表とコード例で整理します。読み終えるころには、「番号が欲しいのか」「セル範囲を操作したいのか」を基準に、4つを使い分けられるようになります。

Column・RowとColumns・Rowsの違い

最初に、4つの役割を表で整理します。

プロパティ主な役割返り値例
ColumnRangeの先頭列番号を取得するLong型の数値Range("B3").Column → 2
RowRangeの先頭行番号を取得するLong型の数値Range("B3").Row → 3
ColumnsRange内の列をRangeとして扱うRangeオブジェクトRange("B2:C5").Columns(1) → B2:B5
RowsRange内の行を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の記事へ進むと、役割の違いを保ったまま理解を深められます。

関連記事


タイトルとURLをコピーしました