Câu code báo lỗi (1 người xem)

  • Thread starter Thread starter 0167767
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

0167767

Thành viên hoạt động
Tham gia
10/3/12
Bài viết
141
Được thích
10
Cho hỏi khi nào, trường hợp nào thì dùng câu này: On Error Resume Next
 
Cho hỏi khi nào, trường hợp nào thì dùng câu này: On Error Resume Next
Câu lệnh này được hiểu là "Nếu gặp lỗi thì bỏ qua và thực hiện câu lệnh kế tiếp". Nếu không có câu lệnh này thì khi chạy code, nếu gặp bất kỳ lỗi nào, code đều dừng lại và báo lỗi, không cho chạy tiếp. Nếu bạn muốn anh chàng VBA lờ đi để thực hiện câu lệnh kế tiếp thì bạn sử dụng câu lệnh này.
Ví dụ: Bạn cần xóa toàn bộ các hàng có nội dung tại cột A là "ABC". Khi đó, bạn sử dụng code sau:
PHP:
Sub Test()
    Dim Rng As Range
    On Error Resume Next
    Set Rng = Sheet1.[A:A].Find(What:="ABC", Lookat:=xlWhole)
    Do
        Rng.EntireRow.Delete
        Set Rng = Sheet1.[A:A].FindNext(Sheet1.[A1])
    Loop Until Rng Is Nothing
End Sub
Bây giờ bạn thử nghiệm chạy code trong các trường hợp có/không có dòng lệnh On Error Resume Next, có/không có dữ liệu "ABC" trên cột A, bạn sẽ thấy tác dụng của lệnh này (có thể nhấn F8 để chạy từng câu lệnh).
 
Upvote 0
Câu lệnh này được hiểu là "Nếu gặp lỗi thì bỏ qua và thực hiện câu lệnh kế tiếp". Nếu không có câu lệnh này thì khi chạy code, nếu gặp bất kỳ lỗi nào, code đều dừng lại và báo lỗi, không cho chạy tiếp. Nếu bạn muốn anh chàng VBA lờ đi để thực hiện câu lệnh kế tiếp thì bạn sử dụng câu lệnh này.
Ví dụ: Bạn cần xóa toàn bộ các hàng có nội dung tại cột A là "ABC". Khi đó, bạn sử dụng code sau:
PHP:
Sub Test()
    Dim Rng As Range
    On Error Resume Next
    Set Rng = Sheet1.[A:A].Find(What:="ABC", Lookat:=xlWhole)
    Do
        Rng.EntireRow.Delete
        Set Rng = Sheet1.[A:A].FindNext(Sheet1.[A1])
    Loop Until Rng Is Nothing
End Sub
Bây giờ bạn thử nghiệm chạy code trong các trường hợp có/không có dòng lệnh On Error Resume Next, có/không có dữ liệu "ABC" trên cột A, bạn sẽ thấy tác dụng của lệnh này (có thể nhấn F8 để chạy từng câu lệnh).
Ví dụ vầy cho đơn giản:
PHP:
Sub Test()
  ActiveSheet.Unprotect "ndu"
End Sub
Trước đó ta protect sheet bằng pass nào đó, xong chạy code trên
Nếu pass thật sự là ndu thì chẳng nói làm gì, ngược lại, nó sẽ "cằn nhằn"
Nếu có dòng On Error Resume Next ở trên
PHP:
Sub Test()
  On Error Resume Next
  ActiveSheet.Unprotect "ndu"
End Sub
thì.. chẳng có việc gì xãy ra cả (hổng phải thì thôi, làm gì dữ vậy)
Ẹc... Ẹc...
 
Upvote 0
Ví dụ: Bạn cần xóa toàn bộ các hàng có nội dung tại cột A là "ABC". Khi đó, bạn sử dụng code sau:
PHP:
Sub Test()
    Dim Rng As Range
    On Error Resume Next
    Set Rng = Sheet1.[A:A].Find(What:="ABC", Lookat:=xlWhole)
    Do
        Rng.EntireRow.Delete
        Set Rng = Sheet1.[A:A].FindNext(Sheet1.[A1])
    Loop Until Rng Is Nothing
End Sub
Bây giờ bạn thử nghiệm chạy code trong các trường hợp có/không có dòng lệnh On Error Resume Next, có/không có dữ liệu "ABC" trên cột A, bạn sẽ thấy tác dụng của lệnh này (có thể nhấn F8 để chạy từng câu lệnh).
Cảm ơn bạn, cho hỏi tiếp
Dim Rang As Range
On Error Resume Next
Set Rang = Sheet1.[A:A].Find(What:="ABC", Lookat:=xlWhole)
Do
Rang.EntireRow.Delete
Set Rang = Sheet1.[A:A].FindNext(Sheet1.[A1])
Loop Until Rang Is Nothing
End Sub
Mấy cái chữ màu xanh nghiêng ở trên, code của bạn là Rng mình thử sửa là rang code chạy cũng bình thường vậy ý nghĩa là gì vậy bạn. Bạn giải thích dùm mình các chữ mình tô đậm màu nâu. Mình dốt quá hỏi xin đừng buồn.
 
Upvote 0
Cảm ơn bạn, cho hỏi tiếp
Dim Rang As Range
On Error Resume Next
Set Rang = Sheet1.[A:A].Find(What:="ABC", Lookat:=xlWhole)
Do
Rang.EntireRow.Delete
Set Rang = Sheet1.[A:A].FindNext(Sheet1.[A1])
Loop Until Rang Is Nothing
End Sub
Mấy cái chữ màu xanh nghiêng ở trên, code của bạn là Rng mình thử sửa là rang code chạy cũng bình thường vậy ý nghĩa là gì vậy bạn. Bạn giải thích dùm mình các chữ mình tô đậm màu nâu. Mình dốt quá hỏi xin đừng buồn.
Rng hay rang thì cũng chỉ là tên biến, do đó bạn thay thế (tất cả) Rng thành rang thì không vấn đề gì. Bạn có thể thay tên biến Rng thành một tên biến bất kỳ, miễn là đó là một tên biến hợp lệ.
Còn những chỗ màu nâu thì biết giải thích sao cho bạn được, có lẽ bạn phải tìm tài liệu về VBA, chẳng hạn đăng ký một cuốn sách ở dòng chữ chạy phía dưới các logo quảng cáo trên diễn đàn (Sách lập trình VBA trong Excel, phiên bản 2) về nghiên cứu từ đầu thì mới hiểu được.
 
Upvote 0
Cảm ơn bạn, cho hỏi tiếp
Dim Rang As Range
On Error Resume Next
Set Rang = Sheet1.[A:A].Find(What:="ABC", Lookat:=xlWhole)
Do
Rang.EntireRow.Delete
Set Rang = Sheet1.[A:A].FindNext(Sheet1.[A1])
Loop Until Rang Is Nothing
End Sub
Mấy cái chữ màu xanh nghiêng ở trên, code của bạn là Rng mình thử sửa là rang code chạy cũng bình thường vậy ý nghĩa là gì vậy bạn. Bạn giải thích dùm mình các chữ mình tô đậm màu nâu. Mình dốt quá hỏi xin đừng buồn.
nghiaphuc nên cắt từ bài này trở về sau vào 1 box khác (chẳng hạn box Trung tâm giải thích code, cụ thể là topic này: Hỏi đáp về VBA (các vấn đề căn bản nhất))
 
Upvote 0
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom