Excelで範囲の各行をループする


116

これは組み込み関数があると確信しているものの1つです(そして、私は以前にそれを言われたことがあるかもしれません)が、それを覚えるために頭を悩ませています。

Excel VBAを使用して複数列の範囲の各行をループするにはどうすればよいですか?私が調べてきたすべてのチュートリアルは、1次元の範囲での作業についてのみ言及しているようです...


回答:


150
Dim a As Range, b As Range

Set a = Selection

For Each b In a.Rows
    MsgBox b.Address
Next

149

このようなもの:

Dim rng As Range
Dim row As Range
Dim cell As Range

Set rng = Range("A1:C2")

For Each row In rng.Rows
  For Each cell in row.Cells
    'Do Something
  Next cell
Next row

8

ちょうどこれにつまずいて、私が私の解決策を提案すると思いました。私は通常、範囲を多次元配列に割り当てる組み込みの機能を使用するのが好きです(私はJS Programmerでもあると思います)。

私は頻繁にこのようなコードを書きます:

Sub arrayBuilder()

myarray = Range("A1:D4")

'unlike most VBA Arrays, this array doesn't need to be declared and will be automatically dimensioned

For i = 1 To UBound(myarray)

    For j = 1 To UBound(myarray, 2)

    Debug.Print (myarray(i, j))

    Next j

Next i

End Sub

変数に範囲を割り当てることは、VBAでデータを操作するための非常に強力な方法です。


私はこの方法が一番好きです!
athos 2017年

2
それを支持する2つの主な利点:1)配列メソッドは常に範囲をループするより高速です、2)単純であり、双方向で使用して、いくつかの計算の後に配列を書き戻すことができますRange("A1:D4") = myarray注: Dim myarrayバリアントとして; デフォルトでは1 ベースの2次元配列であることに注意してください
TM

7

ループではCells、次のように、R1C1参照メソッドを使用して、常にクラスを使用することを好みます。

Cells(rr, col).Formula = ...

これは、迅速かつ容易に私を可能にするループを超える範囲に容易細胞の:

Dim r As Long
Dim c As Long

c = GetTargetColumn() ' Or you could just set this manually, like: c = 1

With Sheet1 ' <-- You should always qualify a range with a sheet!

    For r = 1 To 10 ' Or 1 To (Ubound(MyListOfStuff) + 1)

        ' Here we're looping over all the cells in rows 1 to 10, in Column "c"
        .Cells(r, c).Value = MyListOfStuff(r)

        '---- or ----

        '...to easily copy from one place to another (even with an offset of rows and columns)
        .Cells(r, c).Value = Sheet2.Cells(r + 3, 17).Value


    Next r

End With
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.