1. Khái niệm cơ bản
Duyệt từng hàng trong vùng chọn được hiểu đơn giản là: Bạn có một tập hợp các hàng dữ liệu, và bạn yêu cầu máy tính đi đến từng hàng một, thực hiện một loạt hành động, sau đó mới chuyển sang hàng tiếp theo.
Range (Vùng): Là tập hợp các ô (ví dụ: B2:C11).
Row (Hàng): Là đối tượng đại diện cho dữ liệu của một dòng duy nhất trong vùng đó.
2 Cấu trúc
For Each row In Range(Vùng).Rows
'Code thực thi
Next row
3. Phân tích cấu trúc câu lệnh
Mỗi thành phần trong câu lệnh đều có vai trò cụ thể:
For Each row: Khai báo rằng chúng ta sẽ lấy ra từng “đối tượng” một. Ở đây row là một biến đại diện (bạn có thể đặt tên là dong, r, v.v.).
In Range(Vùng).Rows: Xác định “tập hợp” mà chúng ta sẽ quét qua. Việc thêm đuôi .Rows cực kỳ quan trọng vì nó báo cho máy tính biết bạn muốn duyệt theo từng hàng, chứ không phải từng ô đơn lẻ.
Next row: Sau khi chạy hết các lệnh bên trong, lệnh này sẽ đẩy vòng lặp sang hàng kế tiếp bên dưới.
4. Cấu trúc logic (Pseudocode)
Hãy tưởng tượng bạn đang kiểm tra danh sách học sinh để tìm người thi đỗ:
CHO MỖI (Hàng) TRONG (Danh sách điểm)
Đọc cột "Điểm" của hàng hiện tại.
NẾU Điểm >= 5:
Ghi vào cột "Kết quả": "Passed"
NẾU KHÔNG:
Ghi vào cột "Kết quả": "Failed"
KẾT THÚC VÒNG LẶP
5. Ví dụ thực tế kiểm tra điểm sinh viên
Sub KiemTraDiem()
Dim ws As Worksheet
Dim rgn As Range
Dim rw As Range
Set ws = ThisWorkbook.Sheets("Sheet1")
Set rgn = ws.Range("B2:C11")
For Each rw In rgn.Rows
If rw.Cells(1, 1).Value >= 5 Then
rw.Cells(1, 2).Value = "Passed"
Else
rw.Cells(1, 2).Value = "Failed"
End If
Next rw
End Sub

6. Tại sao nên dùng .Rows thay vì duyệt từng ô?
Khi bạn làm việc với một “Hàng” (Row), bạn có những lợi thế sau:
- Định dạng đồng nhất: Bạn có thể tác động lên toàn bộ hàng cùng lúc (ví dụ: row.Delete để xóa hàng hoặc row.Font.Bold = True để in đậm).
- Truy xuất theo cột dễ dàng: Trong một hàng r, bạn có thể truy cập cột thứ 2 bằng lệnh r.Cells(1, 2). Số 1 ở đây nghĩa là “hàng đầu tiên của chính cái vùng đang xét” (tức là chính nó).
- Tính đọc hiểu cao: Code của bạn sẽ giống như ngôn ngữ tự nhiên: “Với mỗi hàng trong vùng này, hãy làm việc A, việc B”.
7. Các lỗi thường gặp
Quên khai báo biến: Bạn nên dùng Dim row As Range ở đầu chương trình để tối ưu bộ nhớ.
Nhầm lẫn giữa Rows và Cells:
- Range(“A1:B10”) -> Duyệt qua 20 ô (từng ô một).
- Range(“A1:B10”).Rows -> Duyệt qua 10 hàng (mỗi lần xử lý một cụm 2 ô).
Thay đổi vùng dữ liệu khi đang lặp: Hạn chế việc thêm hoặc xóa hàng ngay trong vòng lặp For Each vì nó có thể làm máy tính bị “loạn” chỉ số hàng tiếp theo.
