Range Object - Excel 97

Intersect
Union
Range
Cells
Rows
Columns
Excel
VBA
Tips to handle complexed Range Objects using Excel VBA.
本文を折り畳む 本文を開く

はじめに

Range Object には、様々な形態があります。それらはいずれも Range Object ですが、振る舞いが微妙に異なります。

実例

Rows と Columns で行と列に切り分ける

  1. Range Object の Rows プロパティで、対象領域を行単位に切り出すことができます。切り出した領域は 1 を基点とした配列として扱います。
    Sub Range29()
        MsgBox Sheet1.Range("D5:E6").Rows(2).Address
        MsgBox Sheet1.Range("D5:E6").Rows(2).EntireRow.Address
        MsgBox Sheet1.Range("D5:E6").EntireRow.Address
    End Sub
    
    上のコードは順に $D$6:$E$6 $6:$6 $5:$6 を返します。 EntireRow プロパティは、Range Object を、包含する行全体に拡張します。 これと似た Row プロパティは、単一セルの行アドレスを返すもので、 Rows とは無関係です。
  2. Range Object の Columns プロパティで、対象領域を列単位に切り出すことができます。切り出した領域は 1 を基点とした配列として扱います。
    Sub Range30()
        MsgBox Sheet1.Range("D5:E6").Columns(2).Address
        MsgBox Sheet1.Range("D5:E6").Columns(2).EntireColumn.Address
        MsgBox Sheet1.Range("D5:E6").EntireColumn.Address
    End Sub
    
    上のコードは順に $E$5:$E$6 $E:$E $D:$E を返します。 EntireColumn プロパティは、Range Object を、包含する行全体に拡張します。 これと似た Column プロパティは、単一セルの列アドレスを返すもので、 Coluumns とは無関係です。

複雑な領域を操る

  1. Intersect および Union 関数は、複数の Range Object を統合して、1 つの Range Object を返します。Intersect は共通集合の抽出、 Union は和集合の作成を行います。
    Sub Range31()
        Dim a As Range, b As Range
        Set a = Sheet1.Range("D5:E6")
        Set b = Sheet1.Rows(5)
        MsgBox Intersect(a, b).Address
        MsgBox Union(a, b).Address
    End Sub
    
    上のコードは順に $D$5:$E$5 $D$5:$E$6,$5:$5 を返します。
  2. 不連続な領域の集合になっている Range Object を扱うには、 Areas プロパティによる分解が必要です。 Areas プロパティを配列のように用いて、複雑な Range Object を、単純な Range Object の集合として扱います。
    Sub Range32()
        Dim x As Range, a As Variant, b As Variant
        Dim c As Variant, d As Variant, e As Variant
        Set x = Sheet1.Range("D5:E6,F8:F9,A10:C12")
        a = x.Address
        b = x.Count
        c = x.Areas.Count
        d = x.Areas(2).Address
        e = Application.Index(x, 1, 2, 3)
        Stop
    End Sub
    
    上のコードを実行すれば、 b には全体のセル数 15 が、 c には Areas で分解した時の Range の数 3 が入ります。セルに格納された値を取得するだけなら、 e のように、ワークシート関数の Index を利用することもできます。引数は、( Range, Row, Column, Area ) の順に指定します。
  3. 複数シートによる 3次元串刺し領域を扱うには、 Select を利用します。串刺し領域は、 Selection を利用しなければ扱えません。
    Sub Range33()
        Dim x As Range, a As Sheets
        Sheets(Array("Sheet1", "Sheet2")).Select
        Range("B26:C26").Select
        Selection.FormulaR1C1 = Array(45, "=RC[-1]")
    End Sub
    

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