Chương 13 - Excel VBA Programming For Dummies: Debug - Kỹ thuật xử lý lỗi

Liên hệ QC

handung107

Thành viên gắn bó
Thành viên danh dự
Tham gia
30/5/06
Bài viết
1,630
Được thích
17,436
Nghề nghiệp
Bác sĩ
Kỹ thuật xử lý lỗi

Bài dịch của Workman​

Nếu từ “bug” có nguồn gốc từ một biểu tượng của một con thỏ hoạt hình, thì chương này lại khá đơn giản. đơn giản nhất, một bug là một lỗi trong chương trình của bạn. ở đây tôi sẽ nói về bug lập trình – làm thế nào để xác định chúng và cách xử lý chúng ra khỏi chương trình của mình.

1/ Các loài bug (bọ)

Hoan nghênh đến với ngàn lẻ một loại sâu bọ. khi nói về bug lập trình, như bạn đã biết, ta nói về một trục trặc của một phần mềm. nói cách khác, nếu phần mềm không chạy như dự tính, ta nói phần mềm này có bug. Sự thực là mọi phần mềm trên thế gian này đều có bug – nhiều bug nữa là khác. Có người nói nếu phần mềm không có thì chắc chắn là một phần mềm vứt đi, không đáng để chúng ta quan tâm sử dụng. bản thân Excel có hàng trăm (nếu không nói là hàng ngàn) bug. May mắn thay, một số rất lớn những bug này khá là nhỏ và chỉ xuất hiện trong những trường hợp bất thường.

Khi bạn viết một chương trình VBA, mã của bạn sẽ có bug. Đây là đời thực mà bạn phải chấp nhận, điều này không liên quan gì đến khả năng lập trình của bạn. bug có thể được xếp vào các nhóm sau:

- Lỗ hổng trong logic. Bạn thường tránh những bug này bằng cách suy nghĩ thật kỹ những vấn đề mà chương trình của bạn phải xử lý.
- Bug sai ngữ cảnh. Đây là loại lỗi xuất hiện khi bạn cố gắng ghi dữ liệu vào một ô trong một sheet không phải là loại Worksheet.
- Bug cực đại: là loại bug xảy ra khi bạn gặp phải một loại dữ liệu mà bạn không thể tính được, ví dụ số quá nhỏ hoặc quá lớn
- Bug sai kiểu dữ liệu: là loại lỗi phát sinh do bạn cố gắng xử lý một kiểu dữ liệu sai, ví dụ như bạn cố khai căn của một ký tự chữ.
- Bug sai phiên bản: là loại bug phát sinh khi xử lý những phiên bản Excel khác nhau. Ví dụ, bạn đang xây dựng một workbook sử dụng Excel 204 và sau đó thấy rằng workbook này không làm việc trong Excel 95 hoặc 97. bạn có thể tránh lỗi này bằng cách các đặc điểm của từng loại phiên bản. thông thường cách tiếp cận tốt nhất để phát triển chương trình là bạn sử dụng phiên bản thất nhất mà người sử dụng có.
- Bug vượt quá khả năng lập trình. Là loại bug khó chịu nhất. ví dụ là khi Microsoft nâng cấp bản Excel, những thay đổi chưa được ghi lại có thể làm cho macro bùng nổ.

Xử lý lỗi là một quá trình phát hiện và sửa lỗi trong chương trình của bạn. phát triển kỹ năng xử lý lỗi có thể mất thời gian, do đó đừng nản chí khi thấy phần này quá khó.

Một điều cần lưu ý là các bạn phải phân biệt được bug và lỗi cú pháp. một lỗi cú pháp là một lỗi về ngôn ngữ lập trình. Ví dụ, bạn có thể viết sai chính tả một từ khóa, quên câu lệnh Next trong vòng lặp For-Next. Trước khi bạn chạy chương trình, bạn phải đảm bảo rằng đã sửa hết những lỗi cú pháp. Còn bug chương trình thì đỡ hơn, bạn có thể vẫn chạy được chương trình, nhưng kết quả ra không như mong muốn.

2/ Xác định bug

Trước khi bạn có thể xử lý lỗi, bạn phải xác định xem thực ra có bug hay không. Bạn có thể nói rằng nếu phần mềm không chạy như dự tính, ta nói phần mềm này có bug. Thông thường, nhưng không phải luôn luôn, bạn có thể thấy rõ điều này.

Một bug thường (không phải luôn luôn) được phát hiện khi Excel hiển thị một lỗi run-time error. Hình 13-1 là một ví dụ. Lưu ý rằng thông báo lỗi bao gồm một nút gọi là “Debug”. Tôi sẽ nói rõ hơn trong phần “Nói về sửa bug”.

Điều quan trọng cần nhớ là bug thường xảy ra tại những nơi bạn ít lường tới nhất. ví dụ, chỉ vì macro của bạn làm việc tốt với một dữ liệu nào đó không có nghĩa là nó hoạt động tốt trong mọi loại dữ liệu. cách sửa lỗi tốt nhất là kiểm tra cẩn thận, trong điều kiện thực tế.
 
Kỹ thuật sửa lỗi

Trong phần này, tôi sẽ nói về 4 phương pháp sửa lỗi VBA Excel thông dụng nhất:

- Khảo sát kỹ mã
- Chèn hàm MsgBox vào nhiều nơi khác nhau trong đoạn mã
- Chèn câu lệnh Debug.Print
- Sử dụng công cụ sừa lỗi có sẵn của Excel

1/ Khảo sát kỹ mã

Có lẽ kỹ thuật sửa lỗi đơn giản nhất là hãy xem kỹ lại đoạn mã của bạn để tìm xem những vấn đề trục trặc. nếu bạn may mắn, bạn có thể tìm thấy lỗi và sửa ngay.

Lưu ý tôi nói “nếu bạn may mắn”. Nguyên nhân là đôi khi bạn chỉ có thể tìm ra lỗi sau khi đã làm việc với chương trình của mình 8 tiếng đồng hồ liền. lúc đó đã là 2 giờ sáng và bạn thực tế sống nhờ vào cafein và bản năng. Vào thời điểm đó, bạn sẽ rất may mắn nếu bạn thấy được đoạn mã của mình chứ đừng nói đến chuyện tìm ra lỗi. do đó đừng ngạc nhiên nếu việc khảo sát kỹ mã vẫn không thể xóa sạch mọi bug.

2/ Sử dụng hàm MsgBox

- Một vấn đề mà rất nhiều chương trình mắc phải là một hay vài biến không chứa giá trị mà mình muốn. trong những trường hợp này, giám sát các biến trong khi chương trình đang chạy là một kỹ thuật xử lý lỗi hữu ích. Chúng ta làm việc này bằng cách chèn hàm MsgBox vào nhiều nơi khác nhau trong đoạn mã. Ví dụ, nns bạn có một biến gọi là CellCount, bạn có thể chèn câu lệnh sau:

MsgBox CellCount


Trong khi bạn chạy chương trình, hàm MsgBox sẽ hiển thị giá trị của biến CellCount.

Sẽ còn hữu ích hơn nữa nếu ta cho hiển thị nhiều biến trong một MsgBox. Ví dụ dưới đây hiển thị giá trị của LoopIndex và CellCount như trong hình 13-2

MsgBox LoopIndex & “ “ & CellCount

Lưu ý rằng tôi đã kết hợp 2 biến và chèn thêm một khoảng trắng giữa chúng. Nếu không, hai biến thể hiện trên một MsgBox sẽ trông như là một biến. bạn có thể sử dụng những hằng số sẵn có như vbNewLine, để chèn khoảng trắng giữa các biến. ví dụ sau hiển thị 3 biến, mỗi biến trên một hàng khác nhau

MsgBox LoopIndex & vbNewLine & CellCount & vbNewLine & MyVa

Kỹ thuật này không giới hạn số lượng biến, bạn có thể sử dụng một MsgBox để hiển thị tất cả các loại thông tin trong khi bạn đang chạy chương trình. Ví dụ, nếu đoạn mã của bạn chạy qua nhiều sheet, câu lệnh dưới đây sẽ hiển thị tên và loại của sheet hiện hành

MsgBox Activesheet.Name & “ “ & TypeName (Activesheet)

Tôi sử dụng MsgBox rất thường xuyên khi tôi tìm lỗi chương trình. Bạn chỉ cần lưu ý phải bỏ chúng đi sau khi đã xác định và sửa xong lỗi.

3/ Chèn câu lệnh Debug.Print

Một phương pháp khác tương tự như MsgBox. Đó là bạn có thể chèn một vài câu lệnh Debug.Print. sử dụng những câu lệnh này để in giá trị của một hay nhiều biến trong cửa số Immediate. Đây là ví dụ hiển thị giá trị của 3 biến:

Debug.Print LoopIndex, CellCount, MyVal

Lưu ý rằng biến được tách rời bằng dấu phẩy. bạn có thể hiển thị rất nhiều biến bằng cách sử dụng câu lệnh Debug.Print. nếu bạn không thấy cửa sổ Immediate, bạn hãy bấm tô hợp Ctrl+G

Sau khi bạn sửa lỗi chương trình, nhớ đừng quên xóa những câu lệnh Debug.Print.

4/ Sử dụng công cụ sửa lỗi của VBA (VBA Debugger)

Người thiết kế Excel hẳn phải là người rất quen thuộc với khái niệm bug. Vì thế, Excel có bao gồm một bộ công cụ sửa lỗi để giúp bạn sửa những lỗi trong chương trình VBA của bạn. công cụ sửa lỗi VBA được đề cập trong phần kế tiếp.

- Sử dụng công cụ sửa lỗi VBA

Trong phần này, tôi sẽ nói rất chi tiết về công cụ sửa lỗi Excel. Công cụ này mạnh hơn nhiều so với những kỹ thuật tôi vừa đề cập ở trên. Đương nhiên đi kèm với quyền lợi là trách nhiệm. sử dụng công cụ sửa lỗi cần cài đặt một chút.

- Đặt những điểm ngắt trong đoạn mã

ở phần trước, tôi nói về việc chèn MsgBox trong chương trình để kiểm tra những biến. hiển thị một MsgBox thực chất là ngắt đoạn mã của bạn trong khi đang chạy, và khi bạn click OK sẽ làm chương trình chạy tiếp.

Có một cách hay hơn là chúng ta tạm ngưng việc thực thi chương trình, nhìn vào bất kỳ biến nào, sau đó lại chạy tiếp. Đó là lý do tại sao ta phải đặt những điểm ngắt.

Bạn có thể đặt những điểm ngắt trong VBA bằng nhiều cách

- Dịch chuyển điểm nháy đến nơi bạn cần tạm ngưng, rồi bấm F9
- Click vào cột xám ở phía bên trái đánh dấu vị trí bạn muốn tạm ngưng
- Chỉ vào điểm bạn muốn ngắt, sau đó sử dụng lệnh Debug-Toggle Breakpoint
- Click chuột phải và chọn Toggle Breakpoint từ Menu.

Kết quả thể hiện trong hình 13-3. Excel sẽ highlight dòng lệnh mà bạn đã chọn ngắt, đồng thời chèn một cục tròn tròn to đùng ở cột xám bên tay trái.

Khi thực hiện chương trình, Excel sẽ ở trạng thái “Break Mode” khi chạy đến phần điểm ngắt. Khi ở trạng thái Break Mode, từ “Break” (ngắt) sẽ hiển thị ở dòng trạng thái. Để thoát khỏi trạng thái này và tiếp tục chaỵ chương trình, bấm phím F5 hoặc click vào nút Run/UserForm ở thanh công cụ VBE. Ở phần “đi qua mã lệnh” sắp tới, tôi sẽ nói rõ hơn

Để loại bỏ một điểm ngắt, bạn hãy click vào cái cục tròn to ở cột xám hoặc di chuyển điểm nháy đến nơi highlight rồi bấm F9. để loại bỏ tất cả điểm ngắt, bấm Ctrl+shift+F9

Thế nào là trạng thái Break Mode nhỉ? Nó giống như một trạng thái ngưng đột ngột trong một cuốn phim hoạt họa. chương trình VBA của bạn sẽ tạm ngưng và highlight điểm ngắt bằng màu vàng. Trong trạng thái Break Mode, bạn có thể;

- gõ câu lệnh VBA ở cửa số Immediate (xem phần tiếp theo để biết thêm chi tiết)
- Lướt qua chương trình của bạn để kiểm tra nhiều biến khác nhau trong khi chương trình tạm ngưng

Trong Break Mode, bạn có thể di chuyển con chuột đến các biến để hiển thị những giá trị của chúng. Xem hình 13-4 minh họa.
 
5/ Sử dụng cửa số Immediate

Cửa số Immediate có thể không hiển thị trong VBE. Để thấy cửa số Immediate, bạn bấm vào tổ hợp Ctrl + G

Trong Break Mode, cửa số Immediate rất hữu dụng trong việc tìm giá trị của bất kỳ biến nào. Ví dụ, nếu bạn muốn biết giá trị hiện tại của biến CellCount, bạn gõ câu lệnh này vào cửa số Immediate

Print CellCount

Bạn có thể tíết kiệm vài mili giây bằng cách gõ dấu ? thay vì chữ Print, cụ thể là:

? CellCount

cửa số Immediate cho phép bạn làm nhiều việc khác ngoài việc kiểm tra biến. ví dụ, bạn có thể thay đổi giá trị của biến, kích hoạt một sheet, hoặc ngay cả việc mở một Workbook mới. chỉ cần đảm bảo câu lệnh của bạn là chính xác.

Bạn có thể sử dụng cửa số Immediate khi Excel không ở trong trang thái Break Mode. Tôi thường sử dụng cửa số Immediate để kiểm tra một đoạn mã nhỏ (một dòng lệnh) trước khi gắn nó vào chương trình lớn.

Chạy từng bước

Trong trạng thái Break Mode bạn có thể chạy từng bước từng câu lệnh một. mỗi câu lệnh sẽ được thực thi khi bạn bấm F8. bằng cách chạy từng hàng, bạn có thể mở cửa số Immediate vào bất cứ thời điểm nào để kiểm tra biến.

6/ Sử dụng cửa sổ Watch

Một vài trường hợp bạn cần biết một (hay vài) biến có được gán giá trị chính xác không. Ví dụ giả sử chương trình chạy qua 1000 ô. Bạn thấy hình như là có lỗi xảy ra ở dòng số 900. đương nhiên bạn có thể chèn một điểm ngắt, điều đó có nghĩa là bạn sẽ phải trả lời 899 câu hỏi trước khi chương trình chạy đến chỗ sai. Để giải quyết vấn đề này ta sử dụng cửa sổ Watch.

Ví dụ, bạn có thể lập một cửa số Watch để chương trình của bạn ngưng lại ở trạng thái Break Mode khi một biến có giá trị nhất định, ví dụ Counter=900. để tạo một Watch, chọn Debug-Add Watch để hiển thị hộp thoại Add Watch. Xem hình 13-6

hộp thoại Add Watch có 3 phần:

- Biểu thức: gõ một Biểu thức hoặc một biến. ví dụ Counter=900 hoặc đơn giản là gõ Counter
- Nội dung: chọnmột chương trình và Module bạn muốn Watch. Lưu ý rằng bạn có thể chọn tất cả chương trình.
- Kiểu Watch: bạn click vào các tùy chọn. Lựa chọn đầu tiên, Watch Expression, không ngắt chương trình, nó đơn giản chỉ hiển thị các giá trị khi chương trình bị ngắt.

Hãy chạy thử chương trình của bạn sau khi đã thiết lập Watch. Mọi thứ sẽ chạy bình thường cho đến khi điều kiện Watch thỏa mãn. Khi xảy ra, Excel sẽ ở tình trạng Break Mode (trừ trường hợp kiểu Watch được chọn ở chế độ Watch Expression). Từ đó, bạn có thể đi từng bước hoặc thông qua cửa số Immediate để sửa lỗi chương trình.

Khi bạn thiết lập một Watch, VBE sẽ hiển thị một cửa sổ Watch như hình 13-7. cửa sổ này hiển thị mọi giá trị mà bạn đã định nghĩa.


Cách tốt nhất để hiểu Watch làm việc như thế nào là hãy thử dùng nó. Chẳng mấy chốc mà bạn thấy công dụng của công cụ này.
 
Các phương pháp giảm lỗi

Tôi không thể hướng dẫn các bạn tiêu diệt tất cả lỗi, nhưng tôi có thể cung cấp một vài chiêu giúp cho bạn giảm lỗi đến mức tối thiểu;

- sử dụng câu lệnh Option Explicit khi mới vào chương trình. Câu lệnh này yêu cầu bạn phải định nghĩa tất cả các dữ liệu cho tất cả các biến mà bạn sử dụng. điều này hơi mất công, nhưng nó lại giúp cho chúng ta tránh được những lỗi thông thường như gõ lộn tên biến. Thêm một lợi ích nữa-nó làm cho chương trình chạy nhanh hơn một chút.
- Format chương trình của bạn thành hình răng cưa. Sử dụng cấu trúc răng cưa giúp cho chúng ta xác định từng đoạn mã. Nếu chương trình có nhiều vòng lặp, cấu trúc răng cưa sẽ giúp bạn theo dõi dễ dàng hơn.
- Cẩn thận với câu On Error Resume Next . như tôi đã đề cập trong chương 12, câu này khiến Excel lờ đi những lỗi mà nó không nên bỏ qua. Chương trình của bạn có thể có bug mà bạn không bao giờ biết được.
- Sử dụng nhiều chú thích: không gì kinh khủng bằng việc xem lại mã của mình viết cách đây 6 tháng và không thể hiểu được nó chạy như thế nào. Bằng cách thêm những câu chú thích, bạn sẽ tiết kiệm khá nhiều thời gian đấy
- Cố gắng làm cho Sub và Function đơn giản. viết mã lệnh của bạn trong một Cách đơn giản nhất là bạn tạo thêm 1 cột phụ tại cột B, và đặt điều kiện nếu là các hàng 2, 4, 6, 8...thì có số 1, còn lại là 0 hay bạn muốn điều kiện là "X", cũng được, còn lại là "".
- Tại B1, bạn gõ công thức sau :
- =IF(MOD(ROW(),2)<>0,0,1)
- Kéo xuống dưới để Copy vào các Cell khác trong cột B
- Tại Cell đặt công thức tính tổng các hàng chẵn trong cột A, đặt công thức :
- =SUMIF($B$1:$B$1500,1,$A$1:$A$1500)
- Chúc bạn thành côngcccModule nhỏ, mỗi module có một mục đích rõ ràng và cụ thể.
- Sử dụng macro recorder (ghi macro tự động) để xác định chính xác các phương pháp và cách làm. Khi tôi không nhớ cú pháp hoặc phương pháp, tôi thường ghi lại bằng Macro và xem lại những gì Excel ghi lại.
- Hiểu công cụ sửa lỗi Excel . mặc dù hơi rắc rối một chút, công cụ sửa lỗi của Excel là một công cụ hữu dụng. bạn nên bỏ công nghiên cứu và hiểu rõ.

Sửa lỗi chương trình không phải là công việc ưa thích của tôi, nhưng con quái vật này lại luôn đi đôi với lập trình. Khi bạn có nhiều kinh nghiệm VBA , bạn sẽ cần ít thời gian để sửa lỗi hơn và cách làm cũng sẽ hiệu quả hơn.
 
Web KT
Back
Top Bottom