Range Object - Excel 97

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

はじめに

Range Object をループで扱うコードは、しばしば必要になります。ループさせずに一括処理できれば、その方が効率は良いのですが、細かい制御が必要な場合には、ループも必要でしょう。ここでは、いくつかのパターンのループを紹介します。

実例

セルを順に処理する

  1. Range Object の持つセルを順に処理します。これは 8 回のループになります。
    Sub range34()
        Dim x As Range, y As Range
        Set x = Sheet1.Range("B5:E6")
        For Each y In x
            MsgBox y.Address, vbOKOnly, y.Value
        Next y
    End Sub
    
  2. Range Object の持つセルを順に処理します。これは 8 回のループになります。
    Sub range35()
        Dim x As Range, i As Long
        Set x = Sheet1.Range("B5:E6")
        For i = 1 To x.Count
            MsgBox x(i).Address, vbOKOnly, x(i).Value
        Next i
    End Sub
    

行単位で処理する

  1. Range Object を行単位で処理します。これは 2 回のループになります。
    Sub range36()
        Dim x As Range, y As Range
        Set x = Sheet1.Range("B5:E6").Rows
        For Each y In x
            MsgBox y.Address, vbOKOnly, y.Cells.Count
        Next y
    End Sub
    
  2. Range Object を行単位で処理します。これは 2 回のループになります。
    Sub range37()
        Dim x As Range, i As Long
        Set x = Sheet1.Range("B5:E6").Rows
        For i = 1 To x.Count
            MsgBox x(i).Address, vbOKOnly, x(i).Cells.Count
        Next i
    End Sub
    

列単位で処理する

  1. Range Object を列単位で処理します。これは 4 回のループになります。
    Sub range38()
        Dim x As Range, y As Range
        Set x = Sheet1.Range("B5:E6").Columns
        For Each y In x
            MsgBox y.Address, vbOKOnly, y.Cells.Count
        Next y
    End Sub
    
  2. Range Object を列単位で処理します。これは 4 回のループになります。
    Sub range39()
        Dim x As Range, i As Long
        Set x = Sheet1.Range("B5:E6").Columns
        For i = 1 To x.Count
            MsgBox x(i).Address, vbOKOnly, x(i).Cells.Count
        Next i
    End Sub
    

複雑な領域を単純な領域に分けて処理する

  1. Range Object を単純な Range Object に分けて処理します。これは 2 回のループになります。
    Sub range40()
        Dim x As Range, y As Range
        Set x = Sheet1.Range("B5:E6,G3:H4")
        For Each y In x.Areas
            MsgBox y.Address, vbOKOnly, y.Count
        Next y
    End Sub
    
  2. Range Object を単純な Range Object に分けて処理します。これは 2 回のループになります。
    Sub range41()
        Dim x As Range, i As Long
        Set x = Sheet1.Range("B5:E6,G3:H4")
        For i = 1 To x.Areas.Count
            MsgBox x.Areas(i).Address, vbOKOnly, x.Areas(i).Count
        Next i
    End Sub
    

データに依存したループ

  1. Range Object をデータのある範囲で、行単位にループします。このように、都度、値を読んで判断する方法は、条件を柔軟に決められますが、効率は悪くなります。
    Sub range42()
        Dim x As Range, i As Long
        Set x = Sheet1.Range("B5").Rows
        i = 1
        Do While x(i).Value <> ""
            MsgBox x(i).Address
            i = i + 1
        Loop
    End Sub
    
  2. Range Object をデータのある範囲で、行単位にループします。このように、 End を使えば、最初にループ回数を特定できます。ただし、データが 1 行しかなければ、 End は、シートの端まで飛んでしまうので、注意が必要です。
    Sub range43()
        Dim x As Range, y As Range, i As Long
        Set x = Sheet1.Range("B5")
        Set y = x.End(xlDown)
        For i = 1 To y.Row - x.Row + 1
            MsgBox x(i).Address
        Next i
    End Sub
    
  3. Range Object をデータのある範囲で、行単位にループします。このように、CurrentRegion を使えば、コードがすっきりしますが、正しい範囲を取得できるよう、シートの構成に気をつけなければなりません。
    Sub range44()
        Dim x As Range, y As Range
        Set x = Sheet1.Range("B5").CurrentRegion.Rows
        For Each y In x
            MsgBox y.Address, vbOKOnly, y.Cells.Count
        Next y
    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