Range Object - Excel 97

Offset
Item
Range
Cells
Rows
Columns
Excel
VBA
Tips to address Range Objects using Excel VBA.
本文を折り畳む 本文を開く

はじめに

Range Object の Address 指定には、様々な方法があります。常に固定 Address のデータを扱う場合は簡単ですが、データの量に応じて異なる Address を取得しなければならないような場合には、柔軟なコーディングが要求されます。また、コードの移植性という点に着目すれば、セルの絶対アドレスに依存しない記述が要求されます。この場合には、多少効率を犠牲にしても、相対アドレスを巧みに使ったコーディングが必要になります。

実例

基本的なアドレス指定方法

  1. Worksheet Object の Range プロパティで、アドレスや範囲名を直接指定する方法が最も一般的です。
    Sub Range18()
        MsgBox Sheet1.Range("D5").Address
        MsgBox Sheet1.Range("D5:E7").Address
        MsgBox Sheet1.Range("D5:E7,E9:F9").Address
        Sheet1.Range("D5:D9").Name = "OSAKA"
        MsgBox Sheet1.Range("OSAKA").Address
    End Sub
    
  2. Range プロパティに 2 つの Range Object を指定すれば、それらを包括する矩形領域を指定できます。
    Sub Range19()
        Dim a As Range, b As Range
        Set a = Sheet1.Range("D5")
        Set b = Sheet1.Range("F9:F10")
        MsgBox Sheet1.Range(a, b).Address
    End Sub
    
    上のコードは $D$5:$F$10 を返します。
  3. Range Object の Range プロパティは、対象領域の先頭セルを基点とした相対アドレス指定を可能にします。
    Sub Range20()
        MsgBox Sheet1.Range("D5:E7").Range("B1").Address
        MsgBox Sheet1.Range("D5:E7").Range("F4").Address
    End Sub
    
    上のコードで、1行目は $E$5 を、2行目は $I$8 を返します。親の Range より広い範囲の指定も可能です。
  4. Range Object の Item プロパティは、対象領域の先頭セルを基点とした相対アドレス指定を可能にします。文字ではなく、( Row, Column ) という数値で指定するため、Range Object を配列のように扱えます。
    Sub Range21()
        MsgBox Sheet1.Range("D5:E7").Item(1, 2).Address
        MsgBox Sheet1.Range("D5:E7").Item(4, 6).Address
        MsgBox Sheet1.Range("D5:E7")(1, 2).Address
        MsgBox Sheet1.Range("D5:E7")(4, 6).Address
    End Sub
    
    上のコードで、1行目は $E$5 を、2行目は $I$8 を返します。親の Range より広い範囲の指定も可能です。Item プロパティは Range Object の既定値なので、3行目や 4 行目のように省略して指定することもできます。引数には 1 を基点とした正の数を与えます。
  5. Range Object の Item プロパティに引数を 1 つだけ指定した場合、対象領域の矩形範囲を Column 方向を先に、順次舐めるようにセルを選択できます。領域のセル数を越える数値が指定されたときには、矩形領域がそのまま下方向に延長されたような動きをします。
    Sub Range22()
        Dim a As Range, b As Range
        Set a = Sheet1.Range("D5:E6")
        Set b = Sheet1.Range("D5,E6")
        MsgBox a.Item(1).Address
        MsgBox a.Item(3).Address
        MsgBox a(5).Address
        MsgBox b(5).Address
    End Sub
    
    上のコードで、1行目は $D$5 を、2行目は $D$6 を、3行目は $D$7 を返します。Set を使うことで、まるで配列変数のような簡単な記述が可能となります。変数 b のような複雑な領域の場合には、先頭の連続領域のみが対象となり、4行目は $D$9 を返します。
  6. Cells プロパティは、Worksheet Object や Range Object を Range Object に変換します。Range Object に対して指定した時には、同じ領域を返します。
    Sub Range23()
        MsgBox Sheet1.Cells.Address
        MsgBox Sheet1.Range("D5:E7").Cells.Address
    End Sub
    
    1行目は、$1:$65536 を返し、2行目は $D$5:$E$7 を返します。 Range("D5:E7").Cells(1,2) といった表現を見ることがありますが、これは Cells ではなく Item プロパティの機能です。Item は既定値なので、省略して記述できますが、この正体は、Range("D5:E7").Cells.Item(1,2) です。 Range に Cells を続けても意味は無いので、Range("D5:E7").Item(1,2) としても同じです。
  7. Range Object の Offset プロパティは、対象領域を上下左右にずらした領域に変換します。引数 ( RowOffset, ColumnOffset ) には 0 を基点とした数を与え、マイナスも指定できます。
    Sub Range24()
        MsgBox Sheet1.Range("D5:E7").Offset(0, 1).Address
        MsgBox Sheet1.Range("D5:E7").Offset(1, 0).Address
        MsgBox Sheet1.Range("D5:E7").Offset(0, -1).Address
        MsgBox Sheet1.Range("D5:E7").Offset(-1, 0).Address
    End Sub
    
    上のコードは順に、$E$5:$F$7 $D$6:$E$8 $C$5:$D$7 $D$4:$E$6 を返します。
  8. Range Object の Next プロパティと Previous プロパティは、対象領域の先頭セルの右隣および左隣のセルを返します。
    Sub Range25()
        MsgBox Sheet1.Range("D5:E7").Next.Address
        MsgBox Sheet1.Range("D5:E7").Previous.Address
        MsgBox Sheet1.Range("IV7").Next.Address
        MsgBox Sheet1.Range("A5").Previous.Address
    End Sub
    
    1行目 2行目は、それぞれ $E$5 $C$5 を返し、3行目 4行目はエラーを返します。セルがワークシートの両端にある時は、それを越えるセルを返せないからです。

データに依存したアドレス指定方法

  1. ここでは、次のシート Sheet1 を前提に説明します。
    アドレス指定方法
     ABCDEF
    3   102  
    4      
    5 21222324 
    6 21222324 
    7      
  2. Range Object の CurrentRegion プロパティで、連続データ領域を特定できます。
    Sub Range26()
        MsgBox Sheet1.Range("D5").CurrentRegion.Address
    End Sub
    
    上のコードは、$B$5:$E$6 を返します。 CurrentRegion の返す範囲は、「データの連続する矩形」ではなく、「ブランクでない隣り合うセルをたどって到達できる領域をすべて包含する大きな矩形領域」です。シートの状況によっては、予想以上に大きな範囲を返すこともあります。
  3. Range Object の End プロパティで、データの切れ目を特定できます。引数には、方角を指定します。
    Sub Range27()
        MsgBox Sheet1.Range("D5").End(xlToLeft).Address
        MsgBox Sheet1.Range("D5").End(xlToRight).Address
        MsgBox Sheet1.Range("D5").End(xlUp).Address
        MsgBox Sheet1.Range("D5").End(xlDown).Address
    End Sub
    
    上のコードは順に、$B$5 $E$5 $D$3 $D$6 を返します。これにより Excel の操作で、Control キーを押しながらカーソルキーを押した時の動作と同じ情報を VBA で得ることができます。注意点は、「次の切れ目」を探すため、既に連続領域の端にある場合には、思わぬ場所まで飛んでしまうことがある、ということです。上の例では、xlUp を指定した時に、次のブロックのセルを返しました。
  4. Range Object の Precedents プロパティで参照元の集合領域を、 Dependents プロパティで参照先の集合領域を特定できます。
    Sub Range28()
        MsgBox Sheet1.Range("E1").Precedents.Address
        MsgBox Sheet1.Range("E1").DirectPrecedents.Address
        MsgBox Sheet1.Range("A1").Dependents.Address
        MsgBox Sheet1.Range("A1").DirectDependents.Address
    End Sub
    
    セル E1 に記述されている内容が =$A1 + $C1 であったとすれば、先頭の 2行は、$A$1,$C$1 を、次の 2行は $E$1 を返します。 Direct のつく方は、直接参照のみを、無い方はすべての参照を対象とします。参照関係が無い場合、これらのプロパティはエラーとなります。

Download a Sample Code

上記の解説で用いたサンプルコードは、以下のリンクからダウンロードできます。テキストファイルとして用意しているので、保存して Excel の Visual Basic Editor にインポートしてください。
  1. Save a program source (sample-vbaxlra1-1.bas) on your local disk.
  2. Start Microsoft Excel with a blank(new) book.
  3. Open the Visual Basic Editor. (Tool/Macro/Visual Basic Editor)
  4. Import the downloaded program source. (File/Import Files)

History

2002/3/24
URL移転
2001/3/11
sample-vbaxlra1-1.bas revised
2001/3/11
初版
本文を折り畳む back to home index of VBA