Khi bạn đang phát triển một macro cho người khác sử dụng, bạn có thể muốn thêm một phương thức để người dùng thoát khỏi macro của bạn trước khi nó kết thúc và vẫn giữ quyền kiểm soát những gì macro thực hiện. Ctrl + Break sẽ dừng một macro, nhưng nó không thoát một cách duyên dáng, vì nó cho phép người dùng xem mã trong VBA Editor.

Có một số cách bạn có thể tiếp cận vấn đề này. Đầu tiên là tạo lời nhắc “bạn có muốn thoát không” vào macro của bạn, và sau đó để macro hiển thị lời nhắc định kỳ. Ví dụ, hãy xem xét đoạn mã sau:

Do ...



'    your code goes here

Counter = Counter + 1     If Counter Mod 25 = 0 Then         If MsgBox("Stop Macro?", vbYesNo) = vbYes Then End     End If Loop

Việc xây dựng macro dựa trên tiền đề là bạn có một loạt các bước bạn muốn lặp đi lặp lại nhiều lần, thông qua việc sử dụng cấu trúc Vòng lặp Do …​ Mỗi khi qua vòng lặp, giá trị của Counter được tăng lên. Cứ 25 lần qua vòng lặp, lệnh “dừng macro?” lời nhắc được hiển thị và người dùng có cơ hội thoát.

Cách tiếp cận này dễ thực hiện và có thể hoạt động khá tốt cho một số mục đích. Tuy nhiên, hạn chế lớn nhất của cách tiếp cận này là nó không cho phép lập tức — người dùng phải đợi để thoát khỏi macro cho đến khi có ít nhất 25 lần lặp lại xảy ra.

Một cách tiếp cận khác là “ẩn” mã VBA và áp dụng mật khẩu cho nó.

Bạn thực hiện việc này bằng cách làm theo các bước sau từ bên trong VBA Editor:

  1. Chọn tùy chọn Thuộc tính VBAProject từ menu Công cụ. Trình chỉnh sửa hiển thị hộp thoại Thuộc tính dự án.

  2. Đảm bảo rằng tab Bảo vệ được hiển thị. (Xem Hình 1.)

  3. Chọn hộp kiểm Khóa dự án để xem.

  4. Trong hộp Mật khẩu, hãy nhập mật khẩu bạn muốn sử dụng để bảo vệ macro.

  5. Trong hộp Xác nhận Mật khẩu, hãy nhập cùng một mật khẩu lần thứ hai.

  6. Bấm OK.

Đóng VBA Editor, sau đó lưu sổ làm việc. Với dự án VBA được bảo vệ, người dùng vẫn có thể nhấp vào Ctrl + Break để dừng macro, nhưng họ sẽ không thể truy cập mã chương trình thực tế. Họ sẽ chỉ có thể chọn từ các nút Tiếp tục hoặc Kết thúc, cả hai nút này đều bảo vệ mã của bạn. Như một lợi ích bổ sung, phương pháp này cũng hạn chế người dùng xem mã của bạn bằng cách sử dụng các lựa chọn menu, thanh công cụ hoặc dải băng.

Tuy nhiên, có lẽ cách tiếp cận tốt nhất là tạo một trình xử lý lỗi về cơ bản sẽ chịu trách nhiệm bất cứ khi nào người dùng nhấn Esc hoặc Ctrl + Break. Sau đó, trình xử lý đang chạy có thể hỏi người dùng nếu họ thực sự muốn thoát và sau đó tắt một cách duyên dáng nếu họ làm vậy. Đây là một số mã ví dụ cho thấy cách này được thực hiện:

Sub Looptest()

Application.EnableCancelKey = xlErrorHandler     On Error GoTo ErrHandler

Dim x As Long     Dim y As Long     Dim lContinue As Long

y = 100000000     For x = 1 To y Step 1     Next

Application.EnableCancelKey = xlInterrupt     Exit Sub

ErrHandler:

If Err.Number = 18 Then         lContinue = MsgBox(prompt:=Format(x / y, "0.0%") & _           " complete" & vbCrLf & _           "Do you want to Continue (YES)?" & vbCrLf & _           "Do you want to QUIT? [Click NO]", _           Buttons:=vbYesNo)

If lContinue = vbYes Then             Resume         Else             Application.EnableCancelKey = xlInterrupt             MsgBox ("Program ended at your request")

Exit Sub         End If     End If

Application.EnableCancelKey = xlInterrupt End Sub

Lưu ý rằng ví dụ này sử dụng phương thức EnableCancelKey, gán cho nó tên của nhãn sẽ được chuyển đến nếu phím hủy (Esc hoặc Ctrl + Break) được nhấn. Trong trường hợp này, ErrHandler được chuyển đến và người dùng được hỏi phải làm gì. Nếu người dùng chọn thoát, thì macro sẽ tắt một cách duyên dáng.

Lưu ý rằng điều đầu tiên được thực hiện sau nhãn ErrHandler là kiểm tra xem thuộc tính Number của đối tượng Err có bằng 18. Nếu đúng như vậy, bạn biết rằng một phím hủy đã được nhấn. Nếu không, thì một số loại lỗi khác đã xảy ra và nó phải được xử lý theo bất kỳ cách nào phù hợp với macro của bạn.

_Lưu ý: _

Nếu bạn muốn biết cách sử dụng các macro được mô tả trên trang này (hoặc trên bất kỳ trang nào khác trên trang ExcelTips), tôi đã chuẩn bị một trang đặc biệt bao gồm thông tin hữu ích.

ExcelTips là nguồn của bạn để đào tạo Microsoft Excel hiệu quả về chi phí.

Mẹo này (3021) áp dụng cho Microsoft Excel 97, 2000, 2002 và 2003. Bạn có thể tìm thấy phiên bản của mẹo này cho giao diện ribbon của Excel (Excel 2007 trở lên) tại đây: