1. Tư duy logic
Trong VBA, để chọn một vùng dựa trên giá trị, chúng ta thường đi qua 3 bước:
Duyệt (Loop): Kiểm tra từng ô trong một cột hoặc vùng.
So sánh (Condition): Dùng câu lệnh If…Then để xem giá trị ô đó có khớp với điều kiện không.
Hợp nhất & Chọn (Union & Select): Lưu lại các ô thỏa mãn và chọn tất cả chúng cùng một lúc.
2. Các ví dụ điển hình
Ví dụ 1: Chọn tất cả các ô có giá trị cụ thể (Ví dụ: “Passed”)
Sub SelectRowsBasedOnValue()
Dim cell As Range
Dim targetRange As Range
Dim MyVal As String
MyVal = "Passed" ' Giá trị cần tìm
' Duyệt qua vùng C2:C11
For Each cell In Range("C2:C11")
If cell.Value = MyVal Then
' Nếu là ô thỏa mãn đầu tiên, gán vào targetRange
If targetRange Is Nothing Then
Set targetRange = cell
Else
' Nếu đã có ô trước đó, dùng Union để gộp thêm ô mới vào
Set targetRange = Union(targetRange, cell)
End If
End If
Next cell
' Sau khi tìm xong, nếu có kết quả thì Select
If Not targetRange Is Nothing Then
targetRange.Select
Else
MsgBox "Không tìm thấy giá trị thỏa mãn!"
End If
End Sub

Ví dụ 2: Chọn vùng dựa trên giá trị số (Ví dụ: Điểm> 5)
Sub ChonDiemCao()
Dim r As Range
Dim FinalRange As Range
For Each r In Sheet1.UsedRange.Rows
If IsNumeric(r.Cells(1, 2).Value) And r.Cells(1, 2).Value > 5 Then
If FinalRange Is Nothing Then
Set FinalRange = r
Else
Set FinalRange = Union(FinalRange, r)
End If
End If
Next r
If Not FinalRange Is Nothing Then FinalRange.Select
End Sub

Giải thích các lệnh quan trọng
- Union(Range1, Range2): Đây là hàm cực kỳ quan trọng. Nó giúp bạn “gom” các ô rời rạc lại thành một khối duy nhất để thực hiện lệnh Select một lần duy nhất ở cuối vòng lặp. Điều này giúp code chạy nhanh hơn và tránh màn hình bị giật.
- Nothing: Khi mới bắt đầu, biến targetRange chưa có gì cả (rỗng). Chúng ta cần kiểm tra Is Nothing để biết khi nào cần khởi tạo vùng chọn đầu tiên.
- IsNumeric: Kiểm tra xem ô đó có phải là số không trước khi so sánh lớn hơn/nhỏ hơn để tránh lỗi nếu ô đó chứa chữ.
3.Mẹo nhỏ để nâng tầm Code
Trong thực tế, người ta rất ít khi dùng lệnh .Select vì nó làm chậm chương trình. Thay vì chọn, bạn có thể thực hiện hành động trực tiếp như:
- targetRange.Interior.Color = vbYellow (Tô màu)
- targetRange.Font.Bold = True (In đậm)
