(2) Bạn lấy cái ni thay thế:
PHP:Option Explicit Sub TimVaThayThe() Dim OldText As String, NewText As String, DiaChi As String 'Sa' Dim MyRng As Range, Rng As Range 1 Set MyRng = Range(Cells(1, 1), Cells(18, 4)) OldText = "3": NewText = "test" With MyRng 2 Set Rng = .Find(What:=OldText, LookIn:=xlValues, LookAt:=xlWhole) 3 If Not Rng Is Nothing Then DiaChi = Rng.Address Do With Rng.Offset(, 5) 5 ' With Rng <=| Khong Càn Dòng Này' .Value = NewText .Interior.ColorIndex = 36 .Font.Bold = True End With Set Rng = .FindNext(Rng) 7 ' If Rng Is Nothing Then Exit Sub <=| Khong Càn Dòng Này' Loop While Not Rng Is Nothing And Rng.Address <> DiaChi 9 End If End With End Sub
Với những ghi chú thêm như sau:
C./ Câu lệnh mang số 7 cũng dư thừa không cần thiết;
Cái này đúng vì vòng lặp Do ... Loop sẽ kết thúc khi Rng = Nothing.
Mã:
Loop While Not Rng Is Nothing And Rng.Address <> DiaChi
Vậy chả lý gì thực hiện thêm dòng code đó.
Tất nhiên Exit Sub là thói quen rất xấu. Phải là Exit Do. Tất nhiên trong trường hợp cụ thể này khi vòng lặp Do kết thúc thì Sub cũng kết thúc.
Điều này rõ hơn khi ta xem khối lệnh điều kiện từ dòng lệnh mang số 3 đến dòng lệnh mang số 9; Trong điều kiện này thì không thể nào sẩy ra trường hợp để thực thi dòng lệnh dư này
Sai hoàn toàn. Dòng 6 nó nằm tơ hơ
Mã:
Set Rng = .FindNext(Rng)
Sẽ có lúc Rng = Nothing. Vậy đừng nói: "không thể nào sẩy ra trường hợp để thực thi dòng lệnh dư này".
Nó chỉ để đó như ngồi chơi xơi nước mà thôi.
Tất nhiên là ngồi chơi xơi nước. Nhưng không phải do là "không thể nào sẩy ra trường hợp để thực thi dòng lệnh dư này" mà do vì Rng = Nothing đã là điều kiện ra khỏi vòng lặp Do, tức cũng kết thúc Sub.
-----------------
Về mặt lập trình thì And Rng.Address <> DiaChi là thừa. Vì trong code ví dụ thì làm gì có chuyện ô tìm được đầu tiên cũng sẽ được tìm thấy lần nữa, lần thứ 2 ở bước nào đó tiếp theo???
Do vậy cả dòng DiaChi = Rng.Address cũng thừa.
Hơn thế nữa đk Not Rng Is Nothing And Rng.Address <> DiaChi là sai với hàm ý là sẽ có lỗi. Vì ở thời điểm Rng = Nothing thì truy cập tới thuộc tính của Rng (Rng.Address) sẽ gây ra lỗi "Object variable or With block variable NOT SET"
Nhiều người hay dùng On Error Resume Next nên lắm lúc không ý thức được là code có lỗi.
Lần chỉnh sửa cuối: