VBA khi có lỗi - Các phương pháp hay nhất về xử lý lỗi

Trang tính gian lận lỗi VBA

Lỗi

Sự miêu tảMã VBALỗi trên - Mã dừng và lỗi hiển thịOn Error Goto 0On Error - Bỏ qua lỗi và tiếp tục chạyKhi có lỗi Tiếp tục tiếp theoKhi bị lỗi - Chuyển đến một dòng mã [Nhãn]On Error Goto [Nhãn]Lỗi xóa (Đặt lại)Về lỗi GoTo -1Hiển thị số lỗiMsgBox Err.NumberHiển thị Mô tả lỗiMsgBox Err.DescriptionHàm tự tạo lỗiErr.Raise

Xem thêm VBA “Cheat Sheets” và tải xuống PDF miễn phí

Xử lý lỗi VBA

Xử lý lỗi VBA đề cập đến quá trình dự đoán, phát hiện và giải quyết các lỗi VBA Runtime. Quá trình xử lý lỗi VBA xảy ra khi viết mã, trước khi bất kỳ lỗi nào thực sự xảy ra.

Lỗi thời gian chạy VBA là những lỗi xảy ra trong quá trình thực thi mã. Ví dụ về lỗi thời gian chạy bao gồm:

  • Tham chiếu đến sổ làm việc, trang tính hoặc đối tượng khác không tồn tại
  • Dữ liệu không hợp lệ, ví dụ: tham chiếu đến một ô Excel có lỗi
  • Đang cố gắng chia hết cho 0

VBA về tuyên bố lỗi

Hầu hết việc xử lý lỗi VBA được thực hiện với Tuyên bố về lỗi. Câu lệnh On Error cho VBA biết phải làm gì nếu nó gặp lỗi. Có ba Các tuyên bố về lỗi:

  • Lỗi GoTo 0
  • Khi có lỗi Tiếp tục tiếp theo
  • Lỗi GoTo Hàng

Lỗi GoTo 0

Lỗi GoTo 0 là cài đặt mặc định của VBA. Bạn có thể khôi phục cài đặt mặc định này bằng cách thêm dòng mã sau:

1 Lỗi GoTo 0

Khi xảy ra lỗi với Lỗi GoTo 0, VBA sẽ ngừng thực thi mã và hiển thị hộp thông báo lỗi tiêu chuẩn của nó.

Thường thì bạn sẽ thêm một Lỗi GoTo 0 sau khi thêm Khi có lỗi Tiếp tục tiếp theo xử lý lỗi (phần tiếp theo):

123456789 Lỗi phụGoTo0 ()Khi có lỗi Tiếp tục tiếp theoActiveSheet.Shapes ("Start_Button"). XóaLỗi GoTo 0'Chạy thêm mãKết thúc Sub

Khi có lỗi Tiếp tục tiếp theo

Khi có lỗi Tiếp tục tiếp theo yêu cầu VBA bỏ qua bất kỳ dòng mã nào có lỗi và chuyển sang dòng tiếp theo.

1 Khi có lỗi Tiếp tục tiếp theo

Ghi chú: Khi có lỗi Tiếp tục tiếp theo không sửa lỗi, hoặc giải quyết nó theo cách khác. Nó chỉ đơn giản là yêu cầu VBA tiếp tục như thể dòng mã chứa lỗi không tồn tại. Sử dụng không đúng cách Khi có lỗi Tiếp tục tiếp theo có thể dẫn đến những hậu quả khôn lường.

Một thời gian tuyệt vời để sử dụng Khi có lỗi Tiếp tục tiếp theo là khi làm việc với các đối tượng có thể tồn tại hoặc không. Ví dụ: bạn muốn viết một số mã sẽ xóa một hình dạng, nhưng nếu bạn chạy mã khi hình dạng đã bị xóa, VBA sẽ báo lỗi. Thay vào đó bạn có thể sử dụng Khi có lỗi Tiếp tục tiếp theo để yêu cầu VBA xóa hình dạng nếu nó tồn tại.

123 Khi có lỗi Tiếp tục tiếp theoActiveSheet.Shapes ("Start_Button"). XóaLỗi GoTo 0

Thông báo chúng tôi đã thêm Lỗi GoTo 0 sau dòng mã có chứa lỗi tiềm ẩn. Điều này đặt lại xử lý lỗi.

Trong phần tiếp theo, chúng tôi sẽ chỉ cho bạn cách kiểm tra xem có lỗi xảy ra bằng cách sử dụng Err.Number, cung cấp cho bạn các tùy chọn xử lý lỗi nâng cao hơn…

Err.Number, Err.Clear và bắt lỗi

Thay vì chỉ cần bỏ qua một dòng có lỗi, chúng ta có thể bắt lỗi bằng cách sử dụng Khi có lỗi Tiếp tục tiếp theoErr.Number.

Err.Number trả về một số lỗi tương ứng với loại lỗi được phát hiện. Nếu không có lỗi, Err.Number = 0.

Ví dụ: thủ tục này sẽ trả về "11" vì lỗi xảy ra là Lỗi thời gian chạy '11'.

1234567 Lỗi phụNumber_ex ()Khi có lỗi Tiếp tục tiếp theoActiveCell.Value = 2/0MsgBox Err.NumberKết thúc Sub

Xử lý lỗi với Err.Number

Sức mạnh thực sự của Err.Number nằm ở khả năng phát hiện nếu có lỗi xảy ra (Err.Number 0). Trong ví dụ bên dưới, chúng tôi đã tạo một hàm sẽ kiểm tra xem một trang tính có tồn tại hay không bằng cách sử dụng Err.Number.

12345678910111213141516171819 Kiểm tra phụWS ()MsgBox DoesWSExist ("thử nghiệm")Kết thúc SubHàm DoesWSExist (wsName As String) As BooleanDim ws As WorksheetKhi có lỗi Tiếp tục tiếp theoĐặt ws = Sheets (wsName)'Nếu Lỗi WS không tồn tạiNếu Err.Number 0 ThìDoesWSExist = SaiKhácDoesWSExist = ĐúngKết thúc nếuVề lỗi GoTo -1Chức năng kết thúc

Lưu ý: Chúng tôi đã thêm một Về lỗi GoTo -1 đến cuối đặt lại Err.Number thành 0 (xem hai phần dưới đây).

Với Khi có lỗi Tiếp tục tiếp theoErr.Number, bạn có thể tái tạo "Cố gắng bắt" chức năng của các ngôn ngữ lập trình khác.

Lỗi GoTo Hàng

Lỗi GoTo Hàng yêu cầu VBA “đi tới” một dòng mã được gắn nhãn khi gặp lỗi. Bạn khai báo câu lệnh Go To như thế này (trong đó errHandler là nhãn dòng cần chuyển đến):

1 Lỗi GoTo errHandler

và tạo một nhãn dòng như thế này:

1 errHandler:

Lưu ý: Đây là nhãn tương tự mà bạn sẽ sử dụng với Tuyên bố VBA GoTo thông thường.

Dưới đây chúng tôi sẽ chứng minh bằng cách sử dụng Lỗi GoTo Hàng để thoát khỏi một thủ tục.

Lỗi Thoát Sub

Bạn có thể sử dụng On Error GoTo Line để thoát khỏi sub khi có lỗi.

Bạn có thể thực hiện việc này bằng cách đặt nhãn dòng xử lý lỗi ở cuối quy trình của mình:

12345678 Sub ErrGoToEnd ()Về lỗi GoTo endProc'Một số mãendProc:Kết thúc Sub

hoặc bằng cách sử dụng lệnh Exit Sub:

123456789101112131415 Sub ErrGoToEnd ()Về lỗi GoTo endProc'Một số mãGoTo bỏ quaExitendProc:Thoát Subbỏ qua Exit:'Một số mã khácKết thúc Sub

Err.Clear, On Error GoTo -1 và Reset Err.Number

Sau khi một lỗi được xử lý, bạn nên xóa lỗi nói chung để tránh các vấn đề về xử lý lỗi trong tương lai.

Sau khi xảy ra lỗi, cả hai Err.ClearVề lỗi GoTo -1 có thể được sử dụng để thiết lập lại Err.Number thành 0. Nhưng có một sự khác biệt rất quan trọng: Err.Clear không tự đặt lại lỗi thực tế, nó chỉ đặt lại Err.Number.

Điều đó nghĩa là gì? Sử dụngErr.Clear, bạn sẽ không thể thay đổi cài đặt xử lý lỗi. Để thấy sự khác biệt, hãy kiểm tra mã này và thay thế Về lỗi GoTo -1 với Err.Clear:

123456789101112131415161718192021 Sub ErrExamples ()Về lỗi GoTo errHandler:'Lỗi "do ứng dụng xác định"Lỗi (13)Thoát SuberrHandler:'Xóa lỗiVề lỗi GoTo -1Về lỗi GoTo errHandler2:'Lỗi "Loại không khớp"Lỗi (1034)Thoát SuberrHandler2:Debug.Print Err.DescriptionKết thúc Sub

Thông thường, tôi khuyên bạn nên luôn sử dụng Về lỗi GoTo -1, trừ khi bạn có lý do chính đáng để sử dụng Err.Clear thay thế.

VBA về lỗi MsgBox

Bạn cũng có thể muốn hiển thị Hộp thông báo khi bị lỗi. Ví dụ này sẽ hiển thị các hộp thông báo khác nhau tùy thuộc vào vị trí xảy ra lỗi:

12345678910111213141516171819202122232425262728 Lỗi phụMessageEx ()Dim errMsg As StringLỗi GoTo errHandler'Giai đoạn 1errMsg = "Đã xảy ra lỗi trong giai đoạn Sao chép & Dán."'Err.Raise (11)'Giai đoạn 2errMsg = "Đã xảy ra lỗi trong giai đoạn Xác thực Dữ liệu."'Err.Raise (11)'Giai đoạn 3errMsg = "Đã xảy ra lỗi trong giai đoạn P & L-Building và Copy-Over."Err.Raise (11)'Giai đoạn 4errMsg = "Đã xảy ra lỗi khi cố gắng ghi lại Nhập trên Trang Thiết lập"'Err.Raise (11)GoTo endProcerrHandler:MsgBox errMsgendProc:Kết thúc Sub

Ở đây bạn sẽ thay thế Err.Raise (11) bằng mã thực của bạn.

VBA IsError

Một cách khác để xử lý lỗi là kiểm tra chúng bằng Hàm VBA IsError. Hàm IsError kiểm tra một biểu thức để tìm lỗi, trả về TRUE hoặc FALSE nếu lỗi xảy ra.

123 Sub IsErrorEx ()MsgBox IsError (Phạm vi ("a7"). Giá trị)Kết thúc Sub

Nếu lỗi VBA

Bạn cũng có thể xử lý lỗi trong VBA bằng Hàm IfError trong Excel. Hàm IfError phải được truy cập bằng cách sử dụng Lớp chức năng Worksheet:

1234567 Sub IfErrorEx ()Dim n As Longn = WorksheetFunction.IfError (Phạm vi ("a10"). Giá trị, 0)MsgBox nKết thúc Sub

Điều này sẽ xuất ra giá trị của Phạm vi A10, nếu giá trị là lỗi, nó sẽ xuất ra 0 thay thế.

Các loại lỗi VBA

Lỗi thời gian chạy

Như đã nêu ở trên:

Lỗi thời gian chạy VBA là những lỗi xảy ra trong quá trình thực thi mã. Ví dụ về lỗi thời gian chạy bao gồm:

  • Tham chiếu đến sổ làm việc, trang tính hoặc đối tượng khác không tồn tại
  • Dữ liệu không hợp lệ, ví dụ: tham chiếu đến một ô Excel có lỗi
  • Đang cố gắng chia hết cho 0

Bạn có thể "xử lý lỗi" các lỗi thời gian chạy bằng cách sử dụng các phương pháp được thảo luận ở trên.

Lỗi cú pháp

Lỗi cú pháp VBA là lỗi với việc viết mã. Ví dụ về lỗi cú pháp bao gồm:

  • Viết sai chính tả
  • Thiếu hoặc không chính xác dấu câu

VBA Editor xác định nhiều lỗi cú pháp với tô sáng màu đỏ:

VBA Editor cũng có một tùy chọn để “Kiểm tra cú pháp tự động”:

Khi điều này được chọn, VBA Editor sẽ tạo một hộp thông báo cảnh báo bạn lỗi cú pháp sau khi bạn nhập một dòng mã:

Cá nhân tôi thấy điều này cực kỳ khó chịu và vô hiệu hóa tính năng.

Biên dịch lỗi

Trước khi cố gắng chạy một thủ tục, VBA sẽ "biên dịch" thủ tục. Biên dịch chuyển đổi chương trình từ mã nguồn (mà bạn có thể thấy) thành dạng thực thi (bạn không thể thấy).

Lỗi biên dịch VBA là các lỗi ngăn mã biên dịch.

Một ví dụ điển hình về lỗi biên dịch là khai báo biến bị thiếu:

Các ví dụ khác bao gồm:

  • không có Kế tiếp
  • Lựa chọn không có Kết thúc Lựa chọn
  • Nếu như không có Kết thúc nếu
  • Gọi một thủ tục điều đó không tồn tại

Lỗi cú pháp (phần trước) là một tập hợp con của Lỗi biên dịch.

Gỡ lỗi> Biên dịch

Lỗi biên dịch sẽ xuất hiện khi bạn cố gắng chạy một Thủ tục. Nhưng lý tưởng nhất, bạn nên xác định lỗi biên dịch trước khi cố gắng chạy quy trình.

Bạn có thể làm điều này bằng cách biên dịch dự án trước thời hạn. Để làm như vậy, hãy truy cập Gỡ lỗi> Biên dịch dự án VBA.

Trình biên dịch sẽ "đi đến" lỗi đầu tiên. Sau khi bạn sửa lỗi đó, hãy biên dịch lại dự án. Lặp lại cho đến khi tất cả các lỗi được sửa.

Bạn có thể nói rằng tất cả các lỗi đã được sửa vì Biên dịch dự án VBA sẽ chuyển sang màu xám:

Lỗi OverFlow

Các Lỗi VBA OverFlow xảy ra khi bạn cố gắng đặt một giá trị vào một biến quá lớn. Ví dụ, Biến số nguyên chỉ có thể chứa các giá trị từ -32,768 đến 32,768. Nếu bạn nhập một giá trị lớn hơn, bạn sẽ nhận được lỗi Tràn:

Thay vào đó, bạn nên sử dụng Biến dài để lưu trữ số lượng lớn hơn.

Điều khoản lỗi VBA khác

VBA Catch Error

Không giống như các ngôn ngữ lập trình khác, Trong VBA không có Tuyên bố bắt. Tuy nhiên, bạn có thể sao chép Tuyên bố bắt bằng cách sử dụng Khi có lỗi Tiếp tục tiếp theoNếu Err.Number 0 Thì. Điều này được đề cập ở trên trong Xử lý lỗi với Err.Number.

Lỗi bỏ qua VBA

Để bỏ qua lỗi trong VBA, chỉ cần sử dụng Khi có lỗi Tiếp tục tiếp theo tuyên bố:

1 Khi có lỗi Tiếp tục tiếp theo

Tuy nhiên, như đã đề cập ở trên, bạn nên cẩn thận khi sử dụng câu lệnh này vì nó không sửa được lỗi, nó chỉ bỏ qua dòng mã chứa lỗi.

VBA Ném Error / Err.Raise

Để khắc phục lỗi trong VBA, bạn sử dụng Err.Raise phương pháp.

Dòng mã này sẽ làm tăng lỗi thời gian chạy '13': Nhập không khớp:

1 Err.Raise (13)

Bẫy lỗi VBA

Bẫy lỗi VBA chỉ là một thuật ngữ khác cho Xử lý lỗi VBA.

Thông báo lỗi VBA

MỘT Thông báo lỗi VBA trông như thế này:

Khi bạn nhấp vào 'Gỡ lỗi', bạn sẽ thấy dòng mã gây ra lỗi:

Xử lý lỗi VBA trong một vòng lặp

Cách tốt nhất để xử lý lỗi trong Vòng lặp là sử dụng Khi có lỗi Tiếp tục tiếp theo cùng với Err.Number để phát hiện nếu có lỗi xảy ra (Hãy nhớ sử dụng Err.Clear để xóa lỗi sau mỗi lần xảy ra).

Ví dụ bên dưới sẽ chia hai số (Cột A cho Cột B) và xuất kết quả thành Cột C. Nếu có lỗi, kết quả sẽ là 0.

12345678910111213141516 Kiểm tra phụ ()Làm mờ ô dưới dạng phạm viKhi có lỗi Tiếp tục tiếp theoĐối với mỗi ô trong phạm vi ("a1: a10")'Đặt giá trị ôcell.Offset (0, 2) .Value = cell.Value / cell.Offset (0, 1) .Value'Nếu Cell.Value là Lỗi thì Mặc định thành 0If Err.Number 0 Thìcell.Offset (0, 2) .Value = 0Err.ClearKết thúc nếuKế tiếpKết thúc Sub

Xử lý lỗi VBA trong Access

Tất cả các ví dụ trên đều hoạt động hoàn toàn giống nhau trong Access VBA cũng như trong Excel VBA.

123456789101112131415161718 Hàm DelRecord (frm As Form)'chức năng này được sử dụng để xóa một bản ghi trong bảng khỏi một biểu mẫuKhi lỗi GoTo kết thúcVới frmIf .NewRecord Then.Hoàn tácChức năng thoátKết thúc nếuKết thúc vớiVới frm.RecordsetClone.Bookmark = frm.Bookmark.Xóa bỏfrm.RequeryKết thúc vớiChức năng thoátkết thúc:Kết thúcChức năng kết thúc

Bạn sẽ giúp sự phát triển của trang web, chia sẻ trang web với bạn bè

wave wave wave wave wave