Lặp qua từng hàng của một dải ô trong Excel


116

Đây là một trong những thứ mà tôi chắc chắn rằng có một chức năng tích hợp cho (và tôi có thể đã từng được nói về điều đó trong quá khứ), nhưng tôi đang vò đầu bứt tai để nhớ về nó.

Làm cách nào để lặp qua từng hàng của phạm vi nhiều cột bằng Excel VBA? Tất cả các hướng dẫn mà tôi đã tìm kiếm dường như chỉ đề cập đến việc làm việc trong phạm vi một chiều ...


Câu trả lời:


150
Dim a As Range, b As Range

Set a = Selection

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

149

Một cái gì đó như thế này:

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

Chỉ tình cờ gặp điều này và nghĩ rằng tôi sẽ đề xuất giải pháp của mình. Tôi thường thích sử dụng chức năng tích hợp sẵn để gán một phạm vi cho một mảng nhiều mờ (tôi đoán đó cũng là Lập trình viên JS trong tôi).

Tôi thường xuyên viết mã như thế này:

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

Gán phạm vi cho các biến là một cách rất hiệu quả để thao tác dữ liệu trong VBA.


tôi thích cách này nhất!
athos

2
Hai ưu điểm chính để ủng hộ nó: 1) phương pháp mảng là luôn nhanh hơn vòng lặp thông qua một loạt, 2) nó đơn giản và bạn có thể sử dụng nó trong cả hai chiều và viết lại mảng sau khi một số tính toán: Range("A1:D4") = myarray. Lưu ý: Dim myarray như một biến thể; phải quan tâm đến thực tế rằng đó là một 1based mảng 2dim theo mặc định
TM

7

Trong Vòng lặp, tôi luôn thích sử dụng Cellslớp, sử dụng phương thức tham chiếu R1C1, như thế này:

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

Điều này cho phép tôi nhanh chóng và dễ dàng lặp qua Phạm vi ô một cách dễ dàng:

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.