Vấn đề Lưu Trữ Lỗi Khi Muốn "bắt" Lỗi Của VBA ? | Giải Pháp Excel
Có thể bạn quan tâm
- Trang chủ Có gì mới Hoạt động gần nhất Tác giả
- Diễn đàn Tìm bài viết mới Tìm theo chuyên mục
- Video
Video về Excel Video về tin học khác Tin tức về tin học chung - Thông tin mới Featured content Tìm bài mới Tài Nguyên Mới Hoạt động gần nhất
- Tài nguyên Đánh giá mới nhất Tìm tài nguyên
- Đóng góp
Tìm kiếm
Mọi nơi Đề tài Diễn đàn này Đề tài này Chỉ tìm trong tiêu đề Note Tìm kiếm Tìm nâng cao…- Tìm bài viết mới
- Tìm theo chuyên mục
Follow along with the video below to see how to install our site as a web app on your home screen.
Note: This feature may not be available in some browsers.
- Khách ơi! GPE thông tin đến bạn ấn phẩm "lập trình VBA trong Excel": - Phần cơ bản - Phần Nâng Cao - VBA trong Excel - Cải thiện và tăng tốc
- Trang chủ
- Diễn đàn
- Lập Trình với Excel
- Thread starter Thread starter Nguyen Rem
- Ngày gửi Ngày gửi 10/6/22
Người dùng đang xem chủ đề này
Đang trực tuyến: 2 (Thành viên: 0, Khách: 2)Nguyen Rem
Tất cả chỉ là đưa ra quyết định đúng đắn
Tham gia 23/2/22 Bài viết 211 Được thích 32 Giới tính Nữ Em chào các anh chị ^^ . Em hiện tại có một số chỗ chưa thực sự hiểu khi viết code! Mong cách anh chị cùng em giải thích và khắc phục lỗi Vấn đề: Theo em được biết thì Bộ nhớ của VBA chỉ có thể chứa được một lỗi duy nhất . Để kiểm chứng điều này thì hiện tại trong module 5 của em có một Sub sau: ( Các anh chị nhấn F8 để cho chạy từng dòng code)
Theo như em hiểu thì lúc gặp lỗi thứ nhất (Y = 20/0) , chương trình bỏ qua lỗi này và chạy đến sau ErrMsg: để chạy tiếp (Lỗi này đã được lưu vào bộ nhớ VBA) . Sau đó đến lúc gặp lỗi thứ hai(B = Sqr("abc")) mặc dù chỗ bôi vàng đã dùng để bỏ qua lỗi nhưng mà lỗi vẫn xuất hiện . Điều này là do bộ nhớ đã tồn tại một lỗi rồi ==> Không thể bỏ qua được nữa . Lý thuyết đúng . Ở module 4 : Ta lại có một Sub sau (cái chỗ bôi đỏ là lỗi do thêm item trùng nhau vào một collection -Cố ý! Mục đích là để tìm giá trị bị trùng nhau- )
Chắc đến đây các anh cũng hiểu ý em nói là gì ! Cái chỗ bôi vàng là để bỏ qua lỗi nhưng khi vào vòng lặp For thì lỗi khi thêm item trùng vào collection là rất nhiều (Mâu thuẫn với giả thiết ở trên đưa ra - Bộ nhớ VBA chỉ lưu một lỗi duy nhất-) Câu hỏi: Vậy những điều lập luận của em có sai ở đâu không? và tại sao ? File đính kèm
- Collection .xlsm Collection .xlsm 26.7 KB · Đọc: 7
batman1
Thành viên gạo cội



Tham gia 8/9/14 Bài viết 5,776 Được thích 9,819 Nguyen Rem đã viết: Em chào các anh chị ^^ . Em hiện tại có một số chỗ chưa thực sự hiểu khi viết code! Mong cách anh chị cùng em giải thích và khắc phục lỗi Vấn đề: Theo em được biết thì Bộ nhớ của VBA chỉ có thể chứa được một lỗi duy nhất . Để kiểm chứng điều này thì hiện tại trong module 5 của em có một Sub sau: ( Các anh chị nhấn F8 để cho chạy từng dòng code) View attachment 277157 Theo như em hiểu thì lúc gặp lỗi thứ nhất (Y = 20/0) , chương trình bỏ qua lỗi này và chạy đến sau ErrMsg: để chạy tiếp (Lỗi này đã được lưu vào bộ nhớ VBA) . Sau đó đến lúc gặp lỗi thứ hai(B = Sqr("abc")) mặc dù chỗ bôi vàng đã dùng để bỏ qua lỗi nhưng mà lỗi vẫn xuất hiện . Điều này là do bộ nhớ đã tồn tại một lỗi rồi ==> Không thể bỏ qua được nữa . Lý thuyết đúng . Nhấp chuột vào đây để mở rộng...Không phải thế. Bạn có Mã: Sao chép. Debug.Print "Encounter Error: " & Err.Number Nhưng nếu bạn thêm thành Mã: Sao chép. Debug.Print "Encounter Error: " & Err.Number Debug.Print "Encounter Error: " & Err.Description Thì bạn sẽ có kết quả: Encounter Error: 11 Encounter Error: Division by zero Nếu sau Err.Clear bạn cũng có Mã: Sao chép. Debug.Print "Encounter Error: " & Err.Number 'Encounter Error: 11 Debug.Print "Encounter Error: " & Err.Description thì kết quả là Encounter Error: 0 Encounter Error: Tức mọi thông tin về lỗi gần nhất đã bị xóa hết. Không có cách nào phục hồi được những thông tin về lỗi nữa. Thế còn nguyên nhân tại sao khi gặp B = Sqr("abc") thì lại nhẩy ra cửa sổ báo lỗi mà không thầm lặng thực hiện dòng tiếp theo là Exit Sub? Bạn phải biết là khi có On Error GoTo ErrMsg thì khi gặp lỗi sẽ có bước nhẩy tới Label ErrMsg. Bắt đầu từ đây là việc thực hiện procedure xử lý lỗi. Khi đang trong quá trình xử lý lỗi hiện hành thì On Error Resume Next không tác dụng. Nói nôm na là không thể triển khai việc xử lý lỗi mới khi chưa kết thúc việc xử lý lỗi hiện hành. Khi sảy ra lỗi trong cụm xử lý lỗi hiện hành (bắt đầu từ ErrMsg) thì việc xử lý lỗi tiếp theo này sẽ diễn ra như bình thường, tức xuất hiện cửa sổ thông báo lỗi. Để kết thúc việc xử lý lỗi hiện hành trong cụm xử lý lỗi hiện hành thì dùng On Error Goto -1. Dấu hiệu là việc xử lý lỗi hiện hành đã kết thúc. Ta xét 2 trường hợp: 1. Trong procedure xử lý lỗi hiện hành, tức từ dòng ErrMsg trở đi ta dùng On Error Goto -1 để kết thúc việc xử lý lỗi đã xảy ra. Nhưng ta không thiết lập procedure xử lý lỗi cho lỗi sẽ sảy ra tiếp theo. Lúc này thì khi gặp lỗi tiếp theo thì code sẽ lại nhẩy tới ErrMsg được thiết lập trước đó ở On Error Goto ErrMsg. Muốn mục sở thị thì thay Err.Clear bằng On Error GoTo -1, và xóa On Error Resume Next. Tất nhiên trong trường hợp này thì code sẽ chạy tới ngày tận thế vì cứ thực hiện B = Sqr("abc") thì bị lỗi và nhẩy phải về ErrMsg, rồi sau đó lại gặp B = Sqr("abc") rồi lạy nhẩy về ErrMsg, cứ thế đến "muôn đời". 2. Trong procedure xử lý lỗi hiện hành, tức từ dòng ErrMsg trở đi ta dùng On Error Goto -1 để kết thúc việc xử lý lỗi đã xảy ra, và sau đó thiết lập việc xử lý lỗi mới cho lỗi có thể sảy ra tiếp theo. Muốn mục sở thị thì thay Err.Clear bằng On Error GoTo -1, và giữ nguyên On Error Resume Next. Lúc này thì dòng Exit Sub sẽ được thực thi. Cũng có thể thay On Error Resume Next bằng On Error Goto ErrMsg2. Lúc này thì dòng Exit Sub không được thực thi mà dòng Debug.Print "Encounter Error: " & Err.Number (sau ErrMsg2) được thực thi với kết quả Encounter Error: 13 Dùng On Error Goto -1 ngoài "cụm xử lý lỗi" thì chỉ có tác dụng như Err.Clear.
Ở module 4 : Ta lại có một Sub sau (cái chỗ bôi đỏ là lỗi do thêm item trùng nhau vào một collection -Cố ý! Mục đích là để tìm giá trị bị trùng nhau- ) Chắc đến đây các anh cũng hiểu ý em nói là gì ! Cái chỗ bôi vàng là để bỏ qua lỗi nhưng khi vào vòng lặp For thì lỗi khi thêm item trùng vào collection là rất nhiều (Mâu thuẫn với giả thiết ở trên đưa ra - Bộ nhớ VBA chỉ lưu một lỗi duy nhất-) Câu hỏi: Vậy những điều lập luận của em có sai ở đâu không? và tại sao ? Nhấp chuột vào đây để mở rộng...Kết quả $A$13: R MCRAE $A$17: PRINTERS $A$19: THOMAS S $A$21: MANNERS $A$23: FRAMERS $A$24: FREIGHT 4U là đúng rồi còn gì. Err.Clear là xóa thông tin về lỗi vừa sảy ra. Còn cụm IF ... END IF được thực hiện vì đúng là có lỗi mởi sảy ra. Đâu có phải vì lỗi cũ? Tất nhiên bạn có 2 lần kết quả vì bạn dùng Debug.Print 2 lần. Lần chỉnh sửa cuối: 10/6/22 Upvote 0
Nguyen Rem
Tất cả chỉ là đưa ra quyết định đúng đắn
Tham gia 23/2/22 Bài viết 211 Được thích 32 Giới tính Nữbatman1 đã viết: Không phải thế. Bạn có Mã: Sao chép. Debug.Print "Encounter Error: " & Err.Number Nhưng nếu bạn thêm thành Mã: Sao chép. Debug.Print "Encounter Error: " & Err.Number Debug.Print "Encounter Error: " & Err.Description Thì bạn sẽ có kết quả: Encounter Error: 11 Encounter Error: Division by zero Nếu sau Err.Clear bạn cũng có Mã: Sao chép. Debug.Print "Encounter Error: " & Err.Number 'Encounter Error: 11 Debug.Print "Encounter Error: " & Err.Description thì kết quả là Encounter Error: 0 Encounter Error: Tức mọi thông tin về lỗi gần nhất đã bị xóa hết. Không có cách nào phục hồi được những thông tin về lỗi nữa. Thế còn nguyên nhân tại sao khi gặp B = Sqr("abc") thì lại nhẩy ra cửa sổ báo lỗi mà không thầm lặng thực hiện dòng tiếp theo là Exit Sub? Bạn phải biết là khi có On Error GoTo ErrMsg thì khi gặp lỗi sẽ có bước nhẩy tới Label ErrMsg. Bắt đầu từ đây là việc thực hiện procedure xử lý lỗi. Khi đang trong quá trình xử lý lỗi hiện hành thì On Error Resume Next không tác dụng. Nói nôm na là không thể triển khai việc xử lý lỗi mới khi chưa kết thúc việc xử lý lỗi hiện hành. Khi sảy ra lỗi trong cụm xử lý lỗi hiện hành (bắt đầu từ ErrMsg) thì việc xử lý lỗi tiếp theo này sẽ diễn ra như bình thường, tức xuất hiện cửa sổ thông báo lỗi. Để kết thúc việc xử lý lỗi hiện hành trong cụm xử lý lỗi hiện hành thì dùng On Error Goto -1. Dấu hiệu là việc xử lý lỗi hiện hành đã kết thúc. Ta xét 2 trường hợp: 1. Trong procedure xử lý lỗi hiện hành, tức từ dòng ErrMsg trở đi ta dùng On Error Goto -1 để kết thúc việc xử lý lỗi đã xảy ra. Nhưng ta không thiết lập procedure xử lý lỗi cho lỗi sẽ sảy ra tiếp theo. Lúc này thì khi gặp lỗi tiếp theo thì code sẽ lại nhẩy tới ErrMsg được thiết lập trước đó ở On Error Goto ErrMsg. Muốn mục sở thị thì thay Err.Clear bằng On Error GoTo -1, và xóa On Error Resume Next. Tất nhiên trong trường hợp này thì code sẽ chạy tới ngày tận thế vì cứ thực hiện B = Sqr("abc") thì bị lỗi và nhẩy phải về ErrMsg, rồi sau đó lại gặp B = Sqr("abc") rồi lạy nhẩy về ErrMsg, cứ thế đến "muôn đời". 2. Trong procedure xử lý lỗi hiện hành, tức từ dòng ErrMsg trở đi ta dùng On Error Goto -1 để kết thúc việc xử lý lỗi đã xảy ra, và sau đó thiết lập việc xử lý lỗi mới cho lỗi có thể sảy ra tiếp theo. Muốn mục sở thị thì thay Err.Clear bằng On Error GoTo -1, và giữ nguyên On Error Resume Next. Lúc này thì dòng Exit Sub sẽ được thực thi. Cũng có thể thay On Error Resume Next bằng On Error Goto ErrMsg2. Lúc này thì dòng Exit Sub không được thực thi mà dòng Debug.Print "Encounter Error: " & Err.Number (sau ErrMsg2) được thực thi với kết quả Encounter Error: 13 Dùng On Error Goto -1 ngoài "cụm xử lý lỗi" thì chỉ có tác dụng như Err.Clear. Kết quả $A$13: R MCRAE $A$17: PRINTERS $A$19: THOMAS S $A$21: MANNERS $A$23: FRAMERS $A$24: FREIGHT 4U là đúng rồi còn gì. Err.Clear là xóa thông tin về lỗi vừa sảy ra. Còn cụm IF ... END IF được thực hiện vì đúng là có lỗi mởi sảy ra. Đâu có phải vì lỗi cũ? Tất nhiên bạn có 2 lần kết quả vì bạn dùng Debug.Print 2 lần. Nhấp chuột vào đây để mở rộng...Dạ vâng ạ ! Em đã đọc bài của anh rồi ạ . Và dựa vào câu trả lời của anh thì em cũng đã giải quyết được câu hỏi của mình rồi ! . Em cảm ơn anh nhiều lắm ^^ . Cảm ơn anh đã dành thời gian khắc phục lỗi giúp em Upvote 0 Bạn phải đăng nhập hoặc đăng ký để trả lời bài viết tại đây.
Bài viết mới nhất
- Question Question
- ongke0711
- 6/10/24
- Lập Trình với Excel
- Question Question
- Nguyễn Xuân Sơn
- Thứ năm lúc 13:44
- Lập Trình với Excel
- SA_DQ
- 3/11/25
- Chia sẻ
- nguyendang95
- 23/1/26
- Excel và các ngôn ngữ lập trình khác
- jack nt
- Thứ năm lúc 17:19
- Excel và các ngôn ngữ lập trình khác
- tuantv9
- Thứ hai lúc 23:18
- Excel và các ngôn ngữ lập trình khác
- Question Question
- hoanglocphat
- Thứ năm lúc 10:36
- Lập Trình với Excel
- Nguyenkhang2404
- Thứ ba lúc 20:24
- Hàm và công thức Excel
- giaiphap
- 8/8/15
- Các Add-ins cho excel
- vietdang170
- Thứ tư lúc 12:55
- Các Add-ins cho excel
- Dán lên cao
- Nguyễn Duy Tuân
- 28/11/24
- BLUESOFTS: A-Excel, A-Tools
- quydangktk
- 20/1/11
- Hàm và công thức Excel
- phuongnam366377
- Thứ hai lúc 15:46
- Excel và các ngôn ngữ lập trình khác
- HeSanbi
- 27/11/25
- Các Add-ins cho excel
- Dé Noir
- 23/1/26
- Giải thích, gỡ rối, xử lý lỗi công thức
- Đã giải quyết
- HeSanbi
- 5/3/21
- Lập Trình với Excel
- loandao82
- 21/1/26
- Tìm kiếm, dò tìm và tham chiếu
- BaoBao.9
- 21/1/26
- Hàm và công thức Excel
- vuvannguyen1972
- 23/1/26
- Hướng dẫn sử dụng các hàm trong Excel
- trinhthilan3007
- 23/1/26
- Hỏi đáp những vấn đề khác
Thành viên có số lượng bài viết cao nhất tháng
- ptm0412 48
- Phan Thế Hiệp 19
- dungpham01 17
- nguyendang95 15
- SA_DQ 15
- Gà Công Nghệ 12
- HUONGHCKT 11
- oiquetoi 10
- HeSanbi 10
- AnhThu-1976 9
- DeTong 9
- Maika8008 9
- thanthanhan 8
- anhtuanle123 8
- Gà Con yêu VBA 7
- Cúc Hr 7
- sangdennh 7
- phuongnam366377 7
- ongke0711 7
- DamMeVBAvaExcel 6
Thành viên có điểm tương tác cao nhất tháng
- ptm0412 58
- Phan Thế Hiệp 54
- dungpham01 18
- HUONGHCKT 17
- HieuCD 16
- thanthanhan 12
- DeTong 10
- ongke0711 8
- singfeng 7
- HeSanbi 7
- Maika8008 7
- nguyendang95 7
- SA_DQ 7
- hoangtuaotrang_hp_vn 6
- Cúc Hr 6
- 2013myvietnam 5
- benhuntvnex 5
- chiendich 4
- Nguyễn Duy Tuân 4
- LOGANWover 3
Thời gian đếm ngược.
000 Ngày 00 Giờ 00 phút 00 giây Thân mời tham dự sự kiện sinh nhật GPE 2025- Trang chủ
- Diễn đàn
- Lập Trình với Excel
- Website này sử dụng cookies. Tiếp tục sử dụng trang này, đồng nghĩa với việc bạn chấp nhận website sử dụng cookies. Chấp nhận Tìm hiểu thêm.…
Từ khóa » Bỏ Qua Lỗi Trong Vba
-
Hướng Dẫn Cách Bẫy Lỗi Khi Viết Code Trong VBA
-
HƯỚNG DẪN XỬ LÝ LỖI VBA ĐẦY ĐỦ - Học Excel Online Miễn Phí
-
Cách Xử Lý Lỗi VBA Bằng Các Lệnh On Error - Thủ Thuật
-
VBA Cơ Bản, Bỏ Qua Lỗi Trong VBA ( On Error Resume Next ... - YouTube
-
Xử Lý Lỗi Trong VBA - VietTuts
-
Xử Lý Lỗi | Tự Học VBA
-
Cách Xử Lý Lỗi VBA Bằng Các Lệnh On Error
-
Cách Xử Lý Lỗi VBA Bằng Các Lệnh On Error
-
Cách Xử Lý Lỗi Trong VBA Excel 2016 - Trở Thành Lập Trình Viên
-
Xu Hướng 8/2022 ❤️ Hướng Dẫn Cách Bẫy Lỗi Khi Viết Code ...
-
VBA Về Lỗi GoTo - Các Loại Báo Cáo Về Lỗi Trong VBA
-
Tất Tần Tật Cách Sửa Lỗi VBA Trong Excel - Mobitool
-
On Error Goto Label Không Thoát Lỗi Quá 1 Lần | Giải Pháp Excel
-
Xem Nhiều 8/2022 # Hướng Dẫn Cách Bẫy Lỗi Khi Viết Code Trong ...
-
Xử Lý Lỗi đơn Giản Trong VBA Excel - HelpEx - Trao đổi & Giúp đỡ
-
(DOC) Xu Y Loi Va Bay Loi | Quynh Ngo
-
Sửa Lỗi Msgbox - Các Lỗi Khi Thực Thi Vba