Home » Excel VBA Rangeオブジェクト » 行・列を表すRange » RangeとColumnsの違い

対象:Excel2007, Excel2010, Excel2013, Windows版Excel2016

Excel VBA(Visual Basic for Applications)では、RangeプロパティでもColumnsプロパティでも列を選択することができます。

以下のいずれのプロシージャでも、引数で指定した3列を選択できます。

Sub Rangeプロパティで列を選択する()
 Range("A:C").Select
End Sub

Sub Columnsプロパティで列を選択する()
 Columns("D:F").Select
End Sub

このためでしょうか、RangeプロパティとColumnsプロパティの違いをよくわかってらっしゃらない方が少なくありません。

「マクロ rangeとcolumnsの違い」
といった検索キーワードで、このサイト・インストラクターのネタ帳へのアクセスもあります。

[スポンサードリンク]

Selectメソッドを使ったときには、同じような選択状態になるためRangeとColumnsの違いがよく見えませんが、この2つはまったく別タイプのRangeオブジェクトを取得しています。

RangeプロパティとColumnsプロパティの違い

Rangeプロパティでは個々のセルを表すRangeを単一オブジェクトとして持つRangeコレクションが取得できるのに対し、Columnsプロパティでは列全体のセルを表すRangeを単一オブジェクトとして持つRangeコレクションが取得できます。

以下のSubプロシージャを実行すると、その違いが垣間見えます。
Sub RangeとColumnsの違い()
 MsgBox Range("A:C").Count
 MsgBox Columns("D:F").Count
End Sub

上記のプロシージャを実行すると、
「3145728」
「3」
と、2回メッセージボックスが表示されます。

1回目の「3145728」は、Range("A:C")で取得した、すべてのセルを表すRangeオブジェクトの数(.Count)です。
1,048,576個(1列あたりのセルの個数)×3列で3,145,728個です。

2回目の「3」は、Columns("D:F")で取得した、列を表すRangeオブジェクトの数です。こちらは1列が1個のRangeオブジェクトで、3列ですから3です。

For Each~NextループでRangeとColumnsの違いを確認する

For Each~Nextループを回すと、違いがより明確になります。
Sub ColumnsでForEach()
 Dim rng As Range
 For Each rng In Columns("D:F")
  rng.Select
  MsgBox rng.Address(False, False)
 Next rng
End Sub
上記のColumnsプロパティでは、列が順番に選択され列のアドレスがメッセージボックスに表示される処理が3回だけ繰り返されるのに対し、以下のRangeプロパティで取得した場合は、個々のセルが選択されてセルアドレスが表示されながら、3145728回も繰り返されます。
Sub RangeでForEach()
 Dim rng As Range
 For Each rng In Range("A:C")
  rng.Select
  MsgBox rng.Address(False, False)
 Next rng
End Sub

このプロシージャは、3145728回もメッセージボックスが表示され続けることになりますから、何回かメッセージボックスが表示されてどのセルが選択されているかを確認したら、[Esc]を長押しするか、[Ctrl]+[Pause/Break]でプロシージャを強制終了させてください。

Hiddenプロパティは列を表すRangeオブジェクトで有効

本質的な違いは上記のとおりですが、現象面からは、列を非表示にするコードでも、RangeとColumnsの違いを確認できます。
Sub 列を非表示にする()
 'Range("A:C").Hidden = True
 Columns("D:F").Hidden = True
End Sub

Hiddenプロパティは列を表すRangeオブジェクトで使えるプロパティですから、上記のプロシージャをそのまま実行したときにはD:F列を非表示にできますが、コメントアウトされている「Range("A:C").Hidden = True」を非コメント化すると、実行時エラーが発生します。

[スポンサードリンク]

Home » Excel VBA Rangeオブジェクト » 行・列を表すRange » RangeとColumnsの違い

「行・列を表すRange」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.