HƯỚNG DẪN XỬ LÝ LỖI VBA ĐẦY ĐỦ

 

Bài viết dưới đây hướng dẫn đầy đủ về xử lý lỗi VBA. Nếu bạn đang tìm kiếm một bảng tổng hợp tóm tắt nhanh thì có thể xem mục đầu tiên trong bài viết này của Học Excel Online hướng dẫn.

Trong trường hợp bạn muốn tìm giải pháp cụ thể cho từng lỗi thì có thể xem tiếp các mục phía dưới. Bạn cũng có thể tìm hiểu hiểu toàn bộ cách xử lý lỗi VNA qua toàn bộ bài viết . 

Hướng dẫn xử lý nhanh về lỗi

Mục Mô tả
On Error Goto 0 Khi xảy ra lỗi, mã sẽ dừng và hiển thị lỗi.
On Error Goto -1 Xóa cài đặt lỗi hiện tại và trả về về mặc định.
On Error Resume Next Bỏ qua lỗi và tiếp tục
On Error Goto [Label] Chuyển đến một label cụ thể để xử lý lỗi
Err Object Khi xảy ra lỗi, thông tin lỗi được lưu trữ ở đây
Err.Number Số lỗi.

(Chỉ hữu ích nếu bạn cần kiểm tra một lỗi cụ thể đã xảy ra.)

Err.Description Chứa văn bản lỗi
Err.Source Bạn có thể điền điều này khi bạn sử dụng Err.Raise.
Err.Raise Một chức năng cho phép bạn tạo ra lỗi của riêng mình.
Error Function Trả về văn bản lỗi từ một số lỗi.

Đã lỗi thời.

Error Statement Mô phỏng một lỗi. Sử dụng Err.Raise để thay thế.


  • Giới thiệu

Xử lý lỗi thông thường liên quan đến những mã được viết để xử lý lỗi xảy ra khi ứng dụng đang chạy. Những lỗi này thường nằm ngoài sự kiểm soát như thiếu tệp, cơ sở dữ liệu không khả dụng, dữ liệu không hợp lệ, v.v. Đôi khi những lỗi này sẽ gây khó khăn cho người sử dụng, đặc biệt là người mới sử dụng lập trình VBA. Cho nên hãy xem kỹ hướng dẫn lập trình VBA cho người mới bắt đầu để hiểu mức độ nghiêm trọng của lỗi

Nếu bạn có thể dự đoán được các lỗi có thể xảy ra thì cách tốt nhất là bạn viết mã cụ thể để xử lý lỗi.

Đối với tất cả các lỗi khác mà bạn không dự đoán được thì có thể sử dụng các lệnh để xử lý. Đây là lúc câu lệnh xử lý lỗi VBA phát huy tác dụng. 

Để hiểu cách xử lý lỗi, trước tiên chúng ta phải hiểu các loại lỗi khác nhau trong VBA.

  • Lỗi VBA

Có 3 loại lỗi trong VBA:

  1. Cú pháp
  2. Lỗi biên dịch
  3. Lỗi Runtime

Chúng ta sử dụng Error Handling để giải quyết lỗi runtime error. Trong bài viết này sẽ xem xét từng loại lỗi để từ đó sẽ có cách xử lý hiệu quả.

3.1 Lỗi cú pháp

Nếu bạn thường xuyên sử dụng VBA thì sẽ thấy lỗi cú pháp. Khi bạn nhập một dòng ký tự  và nhấn return thì VBA sẽ đánh giá cú pháp nếu sai sẽ hiển thị thông báo lỗi.

Ví dụ: nếu bạn gõ IF và quên từ khóa Then, VBA sẽ hiển thị thông báo lỗi sau:

huong-dan-xu-ly-loi-VBA-day-du-1

Một số ví dụ về lỗi cú pháp:

huong-dan-xu-ly-loi-VBA-day-du-2

Lỗi cú pháp chỉ liên quan đến một dòng và chúng xảy ra khi cú pháp một dòng không chính xác.

Lưu ý: Bạn có thể tắt hộp thoại lỗi cú pháp bằng cách nhập vào Tools–> Options và chọn “Auto Syntax Check”. Các dòng bị lỗi vẫn hiển thị màu đỏ nhưng hộp thoại sẽ không xuất hiện.

3.2 Lỗi biên dịch

Lỗi biên dịch xảy ra trên một dòng. Cú pháp đúng trên một dòng nhưng không chính xác khi tính đến toàn bộ mã mã. 

Ví dụ về lỗi biên dịch:

  • Sử dụng lệnh IF mà không có lệnh End If.
  • Sử dụng lệnh For mà không có lệnh Next.
  • Sử dụng lệnh Select mà không có lệnh End Select.
  • Gọi một lệnh hoặc Sub không tồn tại.
  • Không khai báo biến (chỉ hoạt động khi tùy chọn này được kích hoạt (Option Explicit ).

Ảnh chụp màn hình sau đây cho thấy lỗi biên dịch xảy ra khi vòng lặp câu lệnh For mà không có câu lệnh Next.

huong-dan-xu-ly-loi-VBA-day-du-3

3.2.1 Sử dụng Debug để gỡ lỗi biên dịch

Để tìm lỗi biên dịch chúng ta sử dụng Debug trên thanh công cụ, sau đó chọn compile VBAproject.

Khi bạn chọn Debug –> Compile, VBA sẽ hiển thị lỗi đầu tiên mà nó gặp phải. Sau khi đã khắc phục lỗi VBA sẽ chạy lại trình biên dịch lần nữa để tìm ra lỗi khác (nếu có).

Sử dụng Debug gỡ lỗi biên dịch rất hữu ích vì nó cũng có thể xác định lỗi cú pháp trong tìm kiếm của nó. 

Nếu mã không có lỗi thì tùy chọn Compile VBAProject sẽ chuyển sang màu xám. 

3.2.2 Tóm tắt sử dụng tùy chọn debug xử lý lỗi biên dịch

  • Debug–> Compile tìm ra lỗi toàn dự án.
  • Debug cũng sẽ tìm thấy lỗi cú pháp.
  • Debug tìm thấy lỗi đầu tiên sau đó chạy lại trình biên dịch để tìm kiếm.
  • Khi không còn lỗi biên dịch thì tùy chọn sẽ chuyển sang màu xám.

3.2.3 Cách sử dụng Debug gỡ lỗi biên dịch

  • Bạn nên sử dụng debug trước khi chạy mã, điều này đảm bảo mã của bạn không có lỗi.
  • Nếu bạn không sử dụng debug thì VBA có thể phát hiện lỗi biên dịch khi nó chạy và nó sẽ trở nên phức tạp nếu xuất hiện lỗi runtime.

3.3 Lỗi Runtime

Lỗi runtime xảy ra khi khi ứng dụng đang chạy. Điều này xuất phát từ lỗi trong mã và thường nằm ngoài tầm kiểm soát.

huong-dan-xu-ly-loi-VBA-day-du-4

Ví dụ nếu chạy đoạn mã được sử dụng để mở workbook Excel nhưng workbook không khả dụng (đã bị xóa hoặc được đổi tên), mã sẽ trả về thông báo lỗi run-time.

Các ví dụ khác về lỗi thời gian chạy:

  • Một cơ sở dữ liệu không có sẵn.
  • Người dùng nhập dữ liệu không hợp lệ.
  • Một ô chứa văn bản thay vì chứa số.

Mục đích xử lý các lỗi biên dịch hay cú pháp là để đối phó với các lỗi runtime khi chúng xảy ra.

Nếu bạn nghĩ lỗi runtime có thể xảy ra thì hãy đặt mã vào vị trí để xử lý nó. Ví dụ, bạn có thể đặt mã vào vị trí xử lý tệp không được tìm thấy.

Sau đó, bạn kiểm tra liệu tệp có tồn tại trước khi nó cố gắng mở ra. Nếu tệp không tồn tại sẽ có một thông báo hiển thị .

huong-dan-xu-ly-loi-VBA-day-du-5

Lỗi mong đợi và không mong đợi

Nếu bạn dự đoán lỗi sẽ xuất hiện trong quá trình chạy thì bạn có thêm mã để xử lý tình huống đó. Trường hợp này là lỗi mong đợi.

Tuy nhiên trong trường hợp bạn không có mã cụ thể để xử lý tình huống đó thì đây được gọi là lỗi không mong muốn. Để khắc phục điều này có thể sử dụng các câu lệnh xử lý lỗi VBA.

3.4 Lỗi Runtime không phải là lỗi VBA

Có một số lỗi runtime không được coi là lỗi của VBA mà do lỗi của người dùng.

Để hiểu rõ hơn thì sẽ xem xét một ví dụ. Giả sử có một ứng dụng yêu cầu bạn thêm các giá trị vào các biến a và b.

huong-dan-xu-ly-loi-VBA-day-du-6

Và bạn sử dụng dấu hoa thị thay cho dấu cộng

huong-dan-xu-ly-loi-VBA-day-du-7

Điều này không phải là lỗi VBA. Lỗi này thuộc về cú pháp và không khớp với yêu cầu ban đầu.

Nhưng lỗi nay không thể xử lý với bất kỳ error handling nào. Có thể khắc phục lỗi này bằng cách sử dụng Unit Testing and Assertions.

4. Sử dụng câu lệnh On error

Như chúng ta đã thấy, có 2 cách xử lý lỗi runtime

  1. Lỗi mong đợi: viết mã cụ thể để xử lý.
  2. Các lỗi không mong muốn: sử dụng các câu lệnh xử lý lỗi VBA.

Câu lệnh VBA On Error được sử dụng để xử lý lỗi. Câu lệnh này thực hiện một số hành động khi xảy ra lỗi runtime.

Có bốn cách để sử dụng lệnh này:

  1. On error Goto 0: mã dừng lại dòng gây ra lỗi và hiển thị thông báo.
  2.   On Error Resume Next: các lỗi xảy ra sẽ bị bỏ qua và mã sẽ tiếp tục chạy.
  3. On Error Go [Label]:  chỉ định những gì mà bạn muốn làm trong trường hợp nếu mã xảy ra lỗi.
  4. On Error GoTo -1: Xóa lỗi hiện tại.

Bây giờ sẽ xem xét lần lượt các câu lệnh.

4.1 On error Goto 0

Đây là một câu lệnh mặc định trong VBA. Khi xảy ra lỗi, VBA dừng trên dòng có lỗi và hiển thị thông báo. Ứng dụng này yêu cầu can thiệp của người dùng với mã trước khi tiếp tục. Bạn có thể sửa lỗi hoặc khởi động lại ứng dụng. Trong trường hợp này xử lý lỗi không diễn ra.

Xem  xét một ví dụ. Trong mã dưới đây chúng ta không sử dụng lệnh On error  trên bất kỳ dòng nào vì vậy VBA sẽ dụng On error Goto 0 theo mặc định.

huong-dan-xu-ly-loi-VBA-day-du-8

Ở dòng gán thứ 2 dẫn đến lỗi chia cho 0. Khi mã chạy bạn sẽ nhận được thông báo lỗi hiển thị như ảnh chụp màn hình dưới đây.

huong-dan-xu-ly-loi-VBA-day-du-9

Khi lỗi xuất hiện, bạn có thể chọn END hoặc Debug.

  • Nếu bạn chọn End  thì ứng dụng dừng lại.
  • Nếu bạn chọn Debug thì ứng dụng dừng trên dòng lỗi  như ảnh chụp dưới đây.

huong-dan-xu-ly-loi-VBA-day-du-10

Điều này sẽ tốt nếu bạn đang viết mã VBA vì nó hiển thị cho bạn dòng lỗi chính xác.

Tuy nhiên nó lại không phù hợp với một số ứng dụng đã được cấp cho người dùng. Những lỗi này thực chất là ứng dụng bị treo, không ổn định vì người dùng phải khởi động lại ứng dụng. Nếu bạn không sửa lỗi thì quá trình có thể bị dừng lại. 

Thay vào đó bạn sử dụng On Error Go To (Label) người dùng có thể kiểm soát tốt hơn, ứng dụng có thể tiếp tục chạy hoặc theo có thể theo chỉ định khác của người dùng.

4.2 Câu lệnh On Error Resume Next

Sử dụng On Error Resume mục đích yêu cầu VBA bỏ qua lỗi và tiếp tục.

Câu lệnh này cũng rất hữu ích nhưng không phải lúc nào cũng có thể sử dụng.

Nếu chúng ta thêm Resume Next vào trong Sub của ví dụ  dưới đây thì VBA sẽ bỏ qua lỗi chia cho 0.

huong-dan-xu-ly-loi-VBA-day-du-11

 

Điều này không hẳn tốt. Nếu bỏ qua những lỗi như thế này bạn có thể nhận được dữ liệu không hợp lệ. 

Mã dưới đây là một ví dụ về sử dụng Resume Next là hữu ích. 

huong-dan-xu-ly-loi-VBA-day-du-12

Trong mã này, mục đích chỉ kiểm tra xem Microsoft Outlook có sẵn trên máy tính hay không và không quan tâm đến lỗi cụ thể.

 

Trong mã trên, ứng dụng vẫn sẽ tiếp tục nếu nó xuất hiện lỗi. Trong dòng tiếp theo sẽ kiểm tra giá trị biến Outlook. Nếu phát sinh lỗi giá trị của biến này được đặt thành Nothing.

Đây là ví dụ cho thấy sự hữu ích của hàm Resume. Trong hầu hết nhiều mã thì Resume rất hạn chế sử dụng. Chỉ nên sử dụng lệnh On Error Resume Next khi chúng ta biết rõ loại lỗi mà mã VBA sẽ bỏ qua và có thể bỏ qua lỗi đó.

4.3 Lệnh On Error GoTo [label]

Đây là một trong những phương pháp xử lý lỗi VBA. Nó giống với câu lệnh Try và Catch trong C# và Java.

Khi xảy ra lỗi bạn đặt nó vào một label cụ thể. Thông thường là ở dưới cùng của Sub.

Hãy xem xét ví dụ dưới đây:

huong-dan-xu-ly-loi-VBA-day-du-13

Ảnh chụp màn hình cho thấy khi xảy ra lỗi

huong-dan-xu-ly-loi-VBA-day-du-14

VBA nhảy đến nhãn eh vì chúng ta đã chỉ định điều này trong dòng On Error Goto.

Lưu ý 1: Label chúng ta sử dụng trong câu lệnh On… GoTo, phải nằm trong Sub/Function hiện tại. Nếu không, bạn sẽ gặp lỗi biên dịch.

Lưu ý 2: Nếu xảy ra lỗi khi sử dụng On Error GoTo [Label], việc xử lý lỗi trở về hành vi mặc định tức là mã sẽ dừng trên dòng có lỗi và hiển thị thông báo lỗi. 

4.4 On Error GoTo -1

Lệnh này khác với 3 lệnh còn lại. Nó được sử dụng để xóa lỗi hiện tại thay vì thiết lập một hành vi cụ thể.

Khi xảy ra lỗi bằng cách sử dụng On Error GoTo [label], hành vi xử lý lỗi sẽ trở về hành vi mặc định “On Error GoTo 0”. Có nghĩa là nếu một lỗi khác xảy ra, mã sẽ dừng trên dòng hiện tại.

Hành vi này chỉ áp dụng cho Sub hiện tại. Khi chúng ta exit sub, lỗi sẽ tự động được xóa.

Hãy xem đoạn mã dưới đây. Lỗi đầu tiên sẽ làm cho mã nhảy đến nhãn eh. Lỗi thứ hai sẽ dừng trên dòng với lỗi 1034.

huong-dan-xu-ly-loi-VBA-day-du-15

Nếu chúng ta thêm error handling thì nó sẽ không hoạt động vì lỗi chưa được xóa.

Trong đoạn mã dưới đây, chúng ta thêm một dòng. 

huong-dan-xu-ly-loi-VBA-day-du-16

Sau khi chúng ta bắt được lỗi đầu tiên.

Điều này không có tác dụng vì lỗi vẫn chưa được xóa. Nói cách khác, mã sẽ dừng trên dòng có lỗi và hiển thị thông báo.

huong-dan-xu-ly-loi-VBA-day-du-17

Để xóa lỗi, chúng tôi sử dụng On Error GoTo -1. Hãy xem nó như bẫy chuột khi bẫy xong bạn cần đặt lại.

Trong đoạn mã bên dưới, chúng ta thêm dòng này và lỗi thứ hai bây giờ sẽ khiến mã nhảy sang nhãn eh_other

huong-dan-xu-ly-loi-VBA-day-du-18

Lưu ý 1: Trong nhiều trường thì sử dụng lệnh On Error Goto – 1 không thực sự hữu ích. Trong nhiều tình huống sử dụng Resume Next sẽ tốt hơn vì nó sẽ xóa lỗi và mã sẽ tiếp tục chạy.

Lưu ý 2: Các Err Object có đối tượng  rõ ràng. Sử dụng Clear sẽ xóa văn bản và số trong Err Objective, nhưng nó KHÔNG đặt lại lỗi.

4.5 Sử dụng lệnh On Error

Như đã nói, VBA sẽ thao tác một trong 3 điều sau khi xảy ra lỗi:

  • Dừng lại và hiển thị.
  • Bỏ qua và tiếp tục.
  • Chuyển đến một dòng cụ thể.

VBA sẽ luôn thực hiện một trong những thao tác này. Khi sử dụng lệnh On Error VBA sẽ thay đổi hành vi mà bạn chỉ định và xóa đi các hành vi trước đó.

Trong SUB sau, VBA thay đổi hành vi lỗi mỗi khi sử dụng câu lệnh On error. 

huong-dan-xu-ly-loi-VBA-day-du-19

5. Resume Next

Câu lệnh này sử dụng để xóa lỗi và mã sẽ tiếp tục chạy từ dòng sau khi sửa lỗi. Nếu mã của bạn có nhiều lỗi và muốn tiếp tục phát hiện thì lệnh này hữu ích.

Ví dụ: trong đoạn mã sau, mã sẽ tiếp tục chạy sau khi lỗi xuất hiện:

huong-dan-xu-ly-loi-VBA-day-du-20

Chúng ta có thể sử dụng On Error Goto -1 để xóa mã và sau đó sử dụng câu lệnh này để quay lại mã như sau:

huong-dan-xu-ly-loi-VBA-day-du-21

Các Resume Next cung cấp cách hoạt động dễ dàng hơn với các mã được rõ ràng và dễ hiểu hơn

6. Err Objective

Khi lỗi xảy ra, bạn có thể xem chi tiết về lỗi bằng đối tượng Err Objective .

Khi xảy ra lỗi runtime VBA sẽ tự động điền thông tin chi tiết vào Err Objective.

Đoạn mã dưới đây sẽ xuất hiện Error Number “13 Type Mismatch”  khi chúng ta cố gắng đặt một giá trị chuỗi trong total.

huong-dan-xu-ly-loi-VBA-day-du-22

Các Err.Description cung cấp chi tiết về các lỗi xảy ra ví dụ: “Type Mismatch”

Các Err.Number là số ID của lỗi ví dụ như số lượng lỗi cho “Type mismatch” là 13. Điều này chi thật sự cần thiết khi bạn muốn kiểm tra các lỗi cụ thể và nó không thật sự thường xuyên.

Các Err.Source là một ý tưởng tuyệt vời nhưng nó lại không làm việc trường hợp chỉ có 1 lỗi VBA. Nguồn sẽ chỉ trả về tên nên vị trí xảy ra lỗi không được thu hẹp. Tuy nhiên, nếu bạn tạo ra lỗi khi sử dụng Err.Raise, bạn có thể tự đặt nguồn và điều này có thể rất hữu ích.

6.1 Lấy số dòng

Hàm Erl được sử dụng để trả về số dòng xảy ra lỗi.

Nó thường gây ra sự nhầm lẫn. Trong đoạn mã sau, Erl sẽ trả về 0

huong-dan-xu-ly-loi-VBA-day-du-23

Điều này là do không có số dòng nào. Hầu hết mọi người không nhận ra điều đó nhưng VBA cho phép bạn có số dòng.

Nếu chúng ta thay đổi Sub ở trên để có số dòng thì bây giờ nó sẽ thể hiện ra 20.

huong-dan-xu-ly-loi-VBA-day-du-24

Thêm số dòng vào mã của bạn theo cách thủ công là rất phức tạp. Tuy nhiên, có những công cụ có sẵn sẽ cho phép bạn dễ dàng thêm và xóa số dòng cho sub.

Khi bạn hoàn thành và giao nó cho người dùng, bạn có thể thêm số dòng. Nếu bạn sử dụng chiến lược xử lý lỗi trong phần cuối cùng của bài đăng này, thì VBA sẽ báo cáo dòng xảy ra lỗi.

6.2 Sử dụng Err.Raise

Err.Raise cho phép chúng ta tạo ra lỗi. Chúng ta có thể sử dụng để tạo lỗi tùy chỉnh cho ứng dụng của mình. Nó tương đương với câu lệnh Throw trong Java \c#.

Định dạng như sau

huong-dan-xu-ly-loi-VBA-day-du-25

Hãy xem một ví dụ đơn giản. Tưởng tượng bạn muốn nhập có độ dài 5 ký tự vào một ô. Chúng tôi có thể có một thông báo cụ thể cho điều này

huong-dan-xu-ly-loi-VBA-day-du-26

Khi tạo lỗi bằng Err.Raise, chúng ta cần cung cấp cho nó một số. Chúng ta có thể sử dụng bất kỳ số nào từ 513 đến 65535 cho lỗi. Chúng ta phải sử dụng vbObjectError.

huong-dan-xu-ly-loi-VBA-day-du-27

6.3 Sử dụng Err Clear

Err.Clear sử dụng để xóa văn bản và số khỏi Err.Object. Với những lỗi thực tế thì chúng ta có thể sử dụng On Error Go To -1 hoặc Resume Next.

Err.Clear hiếm khi sử dụng nhưng một khi sử dụng thì rất hữu ích. Bạn có thể xem một ví dụ dưới đây.

Trong đoạn mã dưới đây, chúng ta đếm số lỗi sẽ xảy ra. Để đơn giản, với mỗi số lẻ chúng ta tạo ra một lỗi.

Chúng ta kiểm tra số lỗi mỗi lần đi qua vòng lặp. Nếu số khác 0 thì đã xảy ra lỗi. Khi chúng ta đếm lỗi, chúng tôi cần đặt số lỗi về 0 để nó sẵn sàng kiểm tra lỗi tiếp theo.

huong-dan-xu-ly-loi-VBA-day-du-28

Lưu ý 1: Err.Clear đặt lại văn bản và số trong đối tượng lỗi nhưng nó không xóa lỗi 

7. Logging

Logging có nghĩa là bạn ghi lại những thông tin từ ứng dụng khi ứng dụng đang chạy. Khi xảy ra lỗi bạn có thể viết chi tiết về các lỗi đó vào một tệp văn bản.

Đoạn mã dưới đây cho thấy quy trình logging rất đơn giản:

huong-dan-xu-ly-loi-VBA-day-du-29

Bạn có thể sử dụng nó như thế này

huong-dan-xu-ly-loi-VBA-day-du-30

Logging không chỉ để ghi lại các lỗi. Bạn có thể ghi lại các thông tin khác khi ứng dụng chạy. Khi xảy ra lỗi, bạn có thể kiểm tra chuỗi sự kiện trước khi xảy ra lỗi.

 Dưới đây là một ví dụ về logging. Cách bạn triển khai logging thực sự phụ thuộc vào bản chất của ứng dụng và mức độ hữu ích của nó.

huong-dan-xu-ly-loi-VBA-day-du-31

Bạn có thể tận dụng thông tin xử lý lỗi rất hữu ích. Thường thì người dùng có thể không cung cấp cho bạn thông tin chính xác về lỗi đã xảy ra. Bằng cách nhìn vào nhật ký, bạn có thể nhận được thông tin chính xác hơn về thông tin.

8. Các mục liên quan đến lỗi khác

Phần này bao gồm một số công cụ Xử lý Lỗi khác mà VBA có. Những mục này hiện nay rất ít sử dụng nhưng vẫn có những thế mạnh nhất định.

8.1 Hàm Error

Hàm Error được sử dụng để mô tả lỗi từ một số lỗi cụ thể. Nó được bao gồm trong VBA và không cần thiết vì bạn có thể sử dụng Err.Description để thay thế.

Dưới đây là một số ví dụ:

huong-dan-xu-ly-loi-VBA-day-du-32

8.2 Lệnh Error

Câu lệnh Error cho phép bạn mô phỏng một lỗi. Nó được bao gồm trong VBA bạn có thể sử dụng Err.Raise để thay thế.

Trong đoạn mã sau, chúng ta mô phỏng lỗi “Divide by 0”.

huong-dan-xu-ly-loi-VBA-day-du-33

Câu lệnh này được bao gồm trong VBA để tương thích ngược (backward compatibility). Bạn nên sử dụng Err.Raise để thay thế.

9. Một số chiến lược xử lý lỗi đơn giản

Bạn có thể nhầm lẫn về cách sử dụng xử lý lỗi trong VBA khi có quá nhiều lựa chọn khác nhau. Trong phần này sẽ hướng dẫn cho bạn cách thực hiện một chiến lược xử lý lỗi đơn giản mà bạn có thể sử dụng trong tất cả các ứng dụng của mình.

Triển khai cơ bản

Đây là tổng quan đơn giản về chiến lược như sau:

  1. Đặt dòng On Error GoTo Label ở Sub đầu trang trên cùng.
  2. Đặt Label xử lý lỗi ở sub cuối trang dưới cùng.
  3. Nếu một lỗi dự kiến ​​xảy ra thì hãy xử lý nó và tiếp tục.
  4. Nếu ứng dụng không thể tiếp tục thì hãy sử dụng Err.Raise để chuyển đến Label xử lý lỗi.
  5. Nếu xảy ra lỗi không mong muốn, mã sẽ tự động chuyển đến Label xử lý lỗi.

Hình ảnh sau đây cho thấy tổng quan về cách thức này

huong-dan-xu-ly-loi-VBA-day-du-34

Đoạn mã sau cho thấy một cách triển khai đơn giản của chiến lược này:

huong-dan-xu-ly-loi-VBA-day-du-35

Đây là một cách tốt để triển khai xử lý lỗi vì

  • Chúng ta không cần thêm mã xử lý lỗi Sub.
  • Nếu xảy ra lỗi thì VBA sẽ thoát ứng dụng.

10. Một chiến lược xử lý lỗi hoàn chỉnh

Chiến lược trên có một nhược điểm lớn là nó không cung cấp bất kỳ thông tin nào về lỗi.

Trong phần này sẽ giới thiệu một chiến lược xử lý lỗi hoàn chỉnh hơn. Sẽ có hai sub phụ hỗ trợ cho bạn trong việc xử lý lỗi.

Mục đích của chiến lược này là cung cấp cho bạn: Stack * và số dòng khi có lỗi.

(* Stack  là danh sách các chức năng con / chức năng hiện đang được sử dụng khi xảy ra lỗi.)

Chiến lược như sau:

  1. Đặt xử lý lỗi trong tất cả các sub.
  2. Khi một lỗi xảy ra, trình xử lý lỗi sẽ thêm các chi tiết của lỗi và chạy thêm một lần nữa.
  3. Khi lỗi tiến đến sub trên cùng, nó sẽ được hiển thị.

Điều này đơn giản là làm nổi  lỗi lên đầu để dễ thấy. Sơ đồ sau đây cho thấy một hình ảnh trực quan đơn giản về những gì sẽ xảy ra khi một lỗi xảy ra trong Sub3.

huong-dan-xu-ly-loi-VBA-day-du-36

Phần phức tạp duy nhất của việc này là định dạng các chuỗi một cách chính xác. có 2 sub sẽ giúp bạn xử lý điều này là  Raiserror và DisplayError.

Ví dụ về việc sử dụng chiến lược này

Đây là một ví dụ mã hóa đơn giản sử dụng các sub. Trong chiến lược này, chúng ta không đặt bất kỳ mã nào trong mã phụ trên cùng. Chúng ta gọi sub từ nó.

Kết quả

huong-dan-xu-ly-loi-VBA-day-du-37

Nếu dự án của bạn có số dòng, kết quả sẽ bao gồm số dòng của lỗi:

huong-dan-xu-ly-loi-VBA-day-du-38

11. Xử lý lỗi trong Nutshell

  • Xử lý Lỗi được sử dụng để xử lý các lỗi xảy ra khi ứng dụng của bạn đang chạy.
  • Bạn viết mã cụ thể để xử lý các lỗi mong đợi. Bạn sử dụng câu lệnh xử lý lỗi VBA On error GoTo [Label] để gửi VBA đến một Label khi xảy ra lỗi không mong muốn.
  • Bạn có thể lấy thông tin chi tiết về lỗi từ Err.Description .
  • Bạn có thể tạo lỗi của riêng mình bằng cách sử dụng Err.Raise .
  • Sử dụng một câu lệnh On Error ở sub đầu sẽ bắt được tất cả các lỗi trong phần sub được gọi từ đây.
  • Nếu muốn ghi tên Sub bị lỗi, bạn có thể cập nhật lỗi và chạy lại.
  • Bạn có thể sử dụng logging để ghi lại thông tin về ứng dụng khi ứng dụng đang chạy.

Và đó là toàn bộ những lỗi VBA thường gặp cùng với cách giải quyết chúng mà Blog Học Excel Online gửi tới các bạn để giúp việc viết các macro cũng như tự động hóa tác vụ diễn ra trơn tru và hiệu quả. Theo dõi toàn bộ khóa học Online VBA của chúng tôi để Excel trở nên dễ dàng.

 


Tác giả: dtnguyen (Nguyễn Đức Thanh)

· · ·

Khóa học mới xuất bản