VBA giúp tự động hóa công việc, nhưng lỗi là điều không tránh khỏi. Hãy tham khảo cách sửa lỗi VBA trong bài viết dưới đây để nắm bắt các phương pháp khắc phục.
Mục Lục:
1. Loại lỗi VBA trong Excel
1.1. Lỗi cú pháp (Syntax Error)
1.2. Lỗi biên dịch (Compile Error)
1.3. Lỗi Run-time Error
1.4. Lỗi Logical Error
2. Cách sửa lỗi VBA trong Excel
2.1. Sử dụng Debug để tìm lỗi biên dịch / lỗi cú pháp
2.2. Cấu hình cài đặt lỗi (lỗi Handled và Unhandled)
3. Xử lý lỗi VBA với lệnh On Error
4. Thuộc tính và phương thức của Err Object
5. Tổng kết
1. Loại lỗi VBA trong Excel
Trước khi khám phá cách sửa lỗi VBA, hãy cùng Mytour điều tra một số loại lỗi phổ biến trong Excel.
Excel VBA có 4 loại lỗi, bao gồm:
- Lỗi cú pháp (Syntax Error).
- Lỗi biên dịch (Compile Error).
- Lỗi Run-time Error.
- Lỗi Logical Error.
1.1 Lỗi Cú Pháp (Syntax Error)
Chính như tên gọi, lỗi cú pháp (Syntax Error) xảy ra khi VBA phát hiện sai sót hoặc cú pháp không đúng trong mã.
Ví dụ, nếu bạn quên một phần của câu lệnh hoặc cú pháp cần thiết, thông báo lỗi biên dịch (Compile Error) sẽ xuất hiện trên màn hình.
Trong đoạn mã dưới đây, sau khi nhấn Enter ở dòng lệnh thứ hai, thông báo lỗi biên dịch sẽ xuất hiện. Nguyên nhân của lỗi là lệnh IF phải đi kèm với lệnh Then, nhưng trong đoạn mã này, lệnh Then đã bị thiếu.
Lưu ý: Khi nhập mã trong Excel VBA, mỗi câu lệnh sẽ được kiểm tra ngay sau khi nhấn Enter. Nếu VBA phát hiện lệnh hoặc một phần nào đó trong cú pháp bị thiếu, nó sẽ ngay lập tức hiển thị thông báo trên màn hình để chúng ta biết nguyên nhân của lỗi.
Để đảm bảo rằng lỗi cú pháp sẽ hiển thị mỗi khi có lỗi hoặc sai sót, hãy kích hoạt Autosyntax. Click chọn Tools, sau đó chọn Options. Trong hộp thoại Options, đảm bảo tùy chọn Auto Syntax Check đã được kích hoạt.
Nếu tùy chọn Auto Syntax Check bị vô hiệu hóa hoặc bị tắt, VBA vẫn sẽ hiển thị dòng có cú pháp lỗi nhưng không xuất hiện hộp thoại thông báo lỗi.
1.2 Lỗi Biên Dịch (Compile Error)
Lỗi biên dịch (Compile error) xuất hiện khi thiếu một thành phần cần thiết để chạy mã.
Ví dụ, khi chạy đoạn mã dưới đây, màn hình sẽ hiển thị thông báo lỗi do sử dụng lệnh IF Then mà thiếu lệnh End If.
Lỗi cú pháp (syntax error) cũng là một dạng lỗi biên dịch. Nó xảy ra ngay sau khi chúng ta nhấn Enter và VBA phát hiện thiếu một phần hoặc cú pháp nào đó. Lỗi biên dịch cũng xảy ra khi VBA không tìm thấy một thành phần nào đó khi nhập mã, nhưng chỉ xảy ra khi mã được biên dịch hoặc thực thi.
Khi nhập mã, VBA kiểm tra từng dòng lệnh và đánh dấu lỗi cú pháp ngay sau khi phát hiện một dòng nào đó không đúng, khi chúng ta nhấn Enter. Ngược lại, lỗi biên dịch chỉ được xác định khi VBA phân tích toàn bộ đoạn mã.
Dưới đây là một số tình huống thường gặp dẫn đến 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.
- Không định nghĩa biến (chỉ có tác dụng khi tùy chọn Option Explicit được kích hoạt).
- Gọi một hàm không tồn tại (hoặc sai tham số).
Lưu ý: Khi bật tùy chọn Option Explicit, chúng ta phải khai báo tất cả biến trước khi chạy mã. Nếu có biến chưa được định nghĩa, VBA sẽ hiển thị thông báo lỗi.
1.3 Lỗi Run-time Error
Lỗi run-time xuất hiện khi mã đang thực thi.
Ví dụ, nếu chạy đoạn mã để mở workbook Excel nhưng workbook không tồn tại (đã bị xóa hoặc đổi tên), mã sẽ hiển thị thông báo lỗi run-time.
Khi lỗi run-time xảy ra, mã sẽ dừng lại và một hộp thoại thông báo sẽ hiển thị để giải thích nguyên nhân của lỗi.
Nhấn nút Debug để làm nổi bật phần mã gây ra lỗi.
Sau khi khắc phục lỗi, bạn có thể nhấn nút Run trên thanh công cụ hoặc nhấn phím F5 để tiếp tục chạy mã. Hoặc bạn có thể chọn nút End để thoát khỏi mã.
Lưu ý quan trọng: Nếu bạn chọn nút End trên hộp thoại, mã sẽ dừng lại ở đoạn bị lỗi. Tất cả các dòng mã trước đó sẽ được thực thi.
1.4 Lỗi Logical Error
Lỗi logic không làm dừng mã, nhưng có thể gây ra kết quả không chính xác. Đây cũng là loại lỗi khó khăn nhất để sửa. Trình biên dịch không phát hiện lỗi này, chúng ta phải tự kiểm tra và sửa theo cách thủ công.
Có nhiều cách để khắc phục lỗi logic trong Excel:
- Chèn Message Box vào những điểm quan trọng trong mã để làm nổi bật mã và các giá trị/dữ liệu.
- Thay vì chạy đoạn mã toàn bộ, hãy chạy từng dòng mã một. Bạn có thể làm điều này bằng cách chọn một vị trí bất kỳ trong mã và nhấn phím F8 để thực thi từng dòng mã một. Điều này giúp dễ dàng xác định lỗi trong từng bước.
2. Tất tần tật cách sửa lỗi VBA trong Excel
Cách 1: Sử dụng Debug để tìm lỗi biên dịch / lỗi cú pháp
Phương án tốt nhất là biên dịch mã trước khi chạy. Để thực hiện điều này, click chọn tùy chọn Debug trên thanh công cụ, sau đó click chọn Compile VBAProject.
Khi biên dịch VBA project, nó sẽ kiểm tra toàn bộ mã và xác định các lỗi (nếu có).
Nếu phát hiện lỗi, VBA sẽ hiển thị hộp thoại thông báo lỗi. Sau khi sửa lỗi, bạn cần chạy lại trình biên dịch để kiểm tra các lỗi khác (nếu có).
Nếu mã không có lỗi, tùy chọn Compile VBAProject sẽ trở thành màu xám.
Lưu ý: Biên dịch mã chỉ phát hiện lỗi cú pháp và lỗi biên dịch, không thể phát hiện lỗi run-time.
Cách 2: Cấu hình các cài đặt lỗi (lỗi Handled và Unhandled)
Trước khi bắt đầu thực thi mã, quan trọng là kiểm tra cài đặt Excel VBA của chúng ta.
Mở thanh công cụ VBA, sau đó nhấn vào Tools => Options.
Trong hộp thoại Options, vào tab General, hãy đảm bảo rằng Break on Unhandled Errors ở phần Error Trapping đã được chọn.
- Tùy chọn Break on All Errors: Dừng thực thi mã khi có bất kỳ loại lỗi nào, ngay cả khi đã xử lý các lỗi này.
- Tùy chọn Break in Class Module: Dừng thực thi mã khi có lỗi chưa được xử lý (Unhandled), đồng thời, nếu sử dụng các đối tượng như Userforms, nó sẽ làm gián đoạn và chỉ ra chính xác dòng gây ra lỗi.
- Tùy chọn Break on Unhandled Errors: Dừng mã chỉ khi có lỗi không được xử lý. Đây là cài đặt mặc định để đảm bảo rằng các lỗi chưa được xử lý sẽ không bị bỏ qua. Trong trường hợp sử dụng các đối tượng như Userforms, tùy chọn này không đánh dấu dòng gây lỗi trong đối tượng mà chỉ đánh dấu dòng tham chiếu đến đối tượng đó.
Lưu ý: Đối với công việc với các đối tượng như Userforms, bạn có thể thay đổi cài đặt này sang Break on Class Modules. Bạn cũng có thể sử dụng tùy chọn thứ hai để hiển thị dòng cụ thể trong đối tượng làm nguyên nhân gây ra lỗi.
3. Xử lý lỗi VBA bằng các lệnh On Error
Xem chi tiết cách xử lý lỗi VBA bằng lệnh Error tại đây
4. Khám phá thuộc tính và phương thức của Err Object (đối tượng Err)
Xem bài viết về thuộc tính và phương thức của đối tượng Err Object tại đây.
5. Tổng kết
Dưới đây là tổng hợp một số phương pháp để xử lý lỗi VBA trong Excel:
1. Sử dụng lệnh On Error Go [Label] ở đầu mã để đảm bảo mọi lỗi đều được xử lý một cách chặt chẽ.
2. Chỉ áp dụng lệnh On Error Resume Next khi chắc chắn rằng mã sẽ không gặp vấn đề nếu có lỗi. Trong trường hợp lỗi, mã sẽ tiếp tục chạy mà không bị gián đoạn. Kết hợp lệnh On Error Resume Next với Err.Raise để bỏ qua một loại lỗi cụ thể.
3. Khi sử dụng trình xử lý lỗi, đảm bảo thêm lệnh Exit Sub trước khi xử lý. Điều này đảm bảo rằng trình xử lý mã lỗi chỉ thực thi khi có lỗi xảy ra, ngược lại nó sẽ bị thực thi mặc dù có lỗi hay không.
4. Sử dụng nhiều trình xử lý để bắt các loại lỗi khác nhau.
Bài viết trên đây của Mytour đã chia sẻ đầy đủ các bước để khắc phục mọi vấn đề về lỗi VBA trong Excel. Nếu có thắc mắc hoặc câu hỏi, hãy chia sẻ ý kiến của bạn trong phần bình luận dưới bài viết nhé.
Ngoài ra, bạn cũng có thể tìm hiểu về cách mở VBA trong Excel theo hướng dẫn chi tiết trên Mytour. Việc mở VBA trong Excel khá đơn giản, giúp bạn dễ dàng thực hiện các công việc lập trình của mình.