Excel VBA(Visual Basic for Applications)では、RangeプロパティでもColumnsプロパティでも列を選択することができます。
以下のいずれのプロシージャでも、引数で指定した3列を選択できます。
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プロシージャを実行すると、その違いが垣間見えます。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ループを回すと、違いがより明確になります。Dim rng As Range
For Each rng In Columns("D:F")
rng.Select
MsgBox rng.Address(False, False)
Next rng
End Sub
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の違いを確認できます。'Range("A:C").Hidden = True
Columns("D:F").Hidden = True
End Sub
Hiddenプロパティは列を表すRangeオブジェクトで使えるプロパティですから、上記のプロシージャをそのまま実行したときにはD:F列を非表示にできますが、コメントアウトされている「Range("A:C").Hidden = True」を非コメント化すると、実行時エラーが発生します。
- Newer:VBAでデクリメント演算子は?
- Older:Word VBAでウィンドウを最大化する
Home » Excel VBA Rangeオブジェクト » 行・列を表すRange » RangeとColumnsの違い