【Excel VBA入門】いろいろなセルの参照

プログラミング

VBAでは、セルや表を操作して処理を実行しますが、明確にセル番号を指定できない場合があります。

このような場合でも使用できるプロパティを紹介します。


Addressプロパティ(参照セルのアドレス取得)

Addressプロパティは、セルやセル範囲のアドレス(セル番号)を文字列で返します。

指定した引数によって得られるアドレスの形式が異なります。

すべての引数は省略可能です。

【構文】
オブジェクト.Address(RowAbsolute, ColumnAbsolute, ReferenceStyle, External, RelativeTo)

設定項目               内 容
オブジェクトRangeオブジェクトを指定します
RowAbsoluteTrue:行の絶対参照(既定値)、False:相対参照 [省略可能]        
セルの参照を絶対参照する場合、「$A$1」などのようにドル記号($)を使用します。
ColumnAbsoluteTrue:列の絶対参照(既定値)、False:相対参照 [省略可能]
ReferenceStyle参照形式の指定を定数で指定。既定値はxlA1 [省略可能](xlA1はHINT参照
ExternalTrue:外部参照形式、False:ローカル参照(既定値)[省略可能]
RelativeTo相対参照形式での基準となるRangeオブジェクトを指定 [省略可能]


A1形式R1C1形式
Excelのアドレスの形式には、A1形式xlA1)とR1C1形式xlR1C1)があります。
A1形式は、列番号のアルファベットと行番号を組み合わせてセルを表示形式です。「A1」や「E5」のように記述できるので読みやすいという特徴があります。
R1C1形式は、基準となるセルから相対的な位置でセルを参照します。書式は「R[行の移動数]C[列の移動数]」となります。行の場合、下方向の移動は正の数、上方向の移動は負の数で指定し、列の場合は、右方向の移動は正の数、左方向の移動は負の数で指定します。移動しない場合は、[]は省略します。



以下のコードでB2セルのアドレスを様々な形式で表示します。

Sub Test()
    Range("B2").Select
    Debug.Print "①行列の絶対参照" & vbTab & ActiveCell.Address
    Debug.Print "②行のみ相対参照" & vbTab & ActiveCell.Address(RowAbsolute:=False)
    Debug.Print "③列のみ相対参照" & vbTab & ActiveCell.Address(ColumnAbsolute:=False)
    Debug.Print "④行列の相対参照" & vbTab & ActiveCell.Address(RowAbsolute:=False, ColumnAbsolute:=False)
    Debug.Print "⑤R1C1形式  " & vbTab & vbTab & ActiveCell.Address(ReferenceStyle:=xlR1C1)
    Debug.Print "⑥外部参照形式" & vbTab & vbTab & ActiveCell.Address(External:=True)
    Debug.Print "⑦A1からの相対参照" & vbTab & ActiveCell.Address(ColumnAbsolute:=False, RowAbsolute:=False, ReferenceStyle:=xlR1C1, Relativeto:=Cells(1, 1))
End Sub


Debug.Print」でVBEのイミディエイトウィンドウに結果を表示させることができます。

また、「vbTab」はタブを表示させるコードです。

上記のマクロを実行すると、イミディエイトウィンドウに以下の結果が表示されます。

マクロ実行結果

①行列の絶対参照 $B$2
②行のみ相対参照 $B2
③列のみ相対参照 B$2
④行列の相対参照 B2
⑤R1C1形式 R2C2
⑥外部参照形式 [Book1]Sheet1!$B$2
⑦A1からの相対参照 R[1]C[1]



CurrentRegionプロパティ(アクティブセル領域)

CurrentRegionプロパティは、指定したセルを含むアクティブセル領域を参照します。

アクティブセル領域とは、アクティブなセルを中心とした空白のセルで囲まれた範囲を指します。

参照したいセル範囲全体をセルで指定する必要がないため、行数や列数に変動のある表を参照したい場合に便利です。

【構文】
オブジェクト.CurrentRegion

設定項目内 容
オブジェクト  Rangeオブジェクトを指定します                          


サンプルの表の状態は以下とします。

VBA-02-01-01


以下のコードでセルの表範囲を取得するいろいろなパターンを示します。

Sub Test()
    Debug.Print "①セルが属する表範囲を取得" & vbTab & Range("B2").CurrentRegion.Address
    Debug.Print "②表の間の空白部分を選択しても表範囲を取得" & vbTab & Range("D4").CurrentRegion.Address
    Debug.Print "③表を囲んだ空白セルは指定セル範囲に属す扱いになる" & vbTab & Range("B8").CurrentRegion.Address
    Debug.Print "④表に属さないと該当セルのみ取得" & vbTab & Range("C9").CurrentRegion.Address
End Sub


上記のマクロを実行すると、イミディエイトウィンドウに以下の結果が表示されます。

マクロ実行結果

①セルが属する表範囲を取得             $B$2:$D$7
②表の間の空白部分を選択しても表範囲を取得     $B$2:$D$7
③表を囲んだ空白セルは指定セル範囲に属す扱いになる $B$2:$D$8
④表に属さないと該当セルのみ取得          $C$9



Endプロパティ(表の端のセル参照)

Endプロパティは、指定したセルが含まれるデータが入力されている領域の終端のセルを取得します。

【構文】
オブジェクト.End(Direction)

設定項目内 容
オブジェクト  Rangeオブジェクトを指定します
Direction移動する方向をxlDirection列挙型の定数で指定します             


xlDirection列挙型の定数

定数方向
 xlUp    上端
 xlDown    下端
 xlToLeft    左端
 xlToRight      右端     


サンプルの表の状態は以下とします。

VBA-02-01-01


以下のコードでセルC2から隙間無くデータの入力された表について、C列の最終行のセルを選択します。

Sub Test()
    Range("C2").End(xlDown).Select
    Debug.Print "表のC列の最終行のセル" & vbTab & ActiveCell.Address(RowAbsolute:=False, ColumnAbsolute:=False)
End Sub


上記のマクロを実行すると、イミディエイトウィンドウに以下の結果が表示されます。

マクロ実行結果

表のC列の最終行のセル C7



基準となるセルと終端セルとの間に空白セルがあると、空白セルの1つ手前のセルを終端セルと認識します。Endプロパティは、空白セルが無い表で使用するようにしてください。



MergeAreaプロパティ(結合されたセル参照)

MergeAreaプロパティは、指定したセルが含まれる結合セル範囲を取得します。

指定したセルが結合セル範囲にない場合は、指定したセルをそのまま返します。

【構文】
オブジェクト.MergeArea

設定項目内 容
オブジェクト  Rangeオブジェクトを指定します                      


サンプルの表の状態は以下とします。

VBA-02-01-02


以下のコードでB5セルの結合セルの範囲を取得します。

Sub Test()
    Debug.Print "B5セルの結合セルの範囲" & vbTab & Range("B5").MergeArea.Address(RowAbsolute:=False, ColumnAbsolute:=False)
End Sub


上記のマクロを実行すると、イミディエイトウィンドウに以下の結果が表示されます。

マクロ実行結果

B5セルの結合セルの範囲 B5:B7



Offsetプロパティ(現在のセルに対して相対的な位置指定)

Offsetプロパティは、指定した行数分および列数分、平行移動したセル範囲を参照します。

【構文】
オブジェクト.Offset(行方向の移動数,列方向の移動数)

設定項目内 容
行方向の移動数  行方向の移動数を指定します。
正の数は下方向、負の数は上方向に移動し、省略した場合は「0」になります。
列方向の移動数列方向の移動数を指定します。
正の数は右方向、負の数は左方向に移動し、省略した場合は「0」になります。


サンプルの表の状態は以下とします。

VBA-02-01-01


以下のコードでB2セルの移動後のセルのアドレスを取得します。

Sub Test()
    Debug.Print "移動後のセルのアドレス" & vbTab & Range("B7").Offset(-2, 2).Address(RowAbsolute:=False, ColumnAbsolute:=False)
End Sub


上記のマクロを実行すると、イミディエイトウィンドウに以下の結果が表示されます。

マクロ実行結果

移動後のセルのアドレス D5



Resizeプロパティ(セル範囲のサイズ変更)

Resizeプロパティは、指定した行数、列数分のセル範囲にサイズを変更したセル範囲を取得します。

表の見出しや、合計行などを取り除いたセル範囲を取得したい場合に使用します。

【構文】
オブジェクト.Resize(RowSize,ColumnSize)

設定項目内 容
RowSize新しい範囲の行数を指定します。                      
ColumnSize  新しい範囲の列数を指定します。


以下のコードでB2セルのサイズを変更したセルの範囲を取得します。

Sub Test()
    Debug.Print "移動後のセルのアドレス" & vbTab & Range("B2").Resize(2, 3).Address(RowAbsolute:=False, ColumnAbsolute:=False)
End Sub


上記のマクロを実行すると、イミディエイトウィンドウに以下の結果が表示されます。

マクロ実行結果

移動後のセルのアドレス B2:D3