هنگامی که در حال توسعه یک ماکرو برای استفاده دیگران هستید، ممکن است بخواهید روشی اضافه کنید تا کاربر قبل از پایان ماکرو شما از ماکرو خارج شود و همچنان کنترل کارهای ماکرو را حفظ کند. Ctrl+Break یک ماکرو را متوقف می کند، اما به خوبی از آن خارج نمی شود، زیرا به کاربر اجازه می دهد کد را در ویرایشگر VBA مشاهده کند.
راه های مختلفی برای حل این مشکل وجود دارد. اولین مورد این است که یک دستور "آیا می خواهید خارج شوید" را در ماکرو خود بسازید و سپس ماکرو درخواست را به صورت دوره ای نمایش دهد. به عنوان مثال، کد زیر را در نظر بگیرید:
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
ساخت ماکرو بر این فرض استوار است که شما یک سری مراحل دارید که می خواهید بارها و بارها با استفاده از ساختار Do... Loop تکرار کنید. هر بار که از طریق حلقه، مقدار Counter افزایش می یابد. هر 25 بار از طریق حلقه، "توقف ماکرو؟" درخواست نمایش داده می شود و کاربر فرصتی برای خروج دارد.
اجرای این رویکرد آسان است و ممکن است برای برخی اهداف کاملاً خوب عمل کند. با این حال، بزرگترین ایراد این رویکرد این است که فوریت را اجازه نمی دهد - کاربر باید منتظر بماند تا حداقل 25 تکرار رخ دهد تا از ماکرو خارج شود.
روش دیگر "مخفی کردن" کد VBA و اعمال رمز عبور برای آن است. این کار را با دنبال کردن مراحل زیر از ویرایشگر VBA انجام می دهید:

شکل 1. تب Protection از کادر محاوره ای Project Properties.
- از منوی Tools گزینه VBAProject Properties را انتخاب کنید. ویرایشگر گفتگوی Project Properties را نمایش می دهد.
- مطمئن شوید که تب Protection نمایش داده شده است. (شکل 1 را ببینید.)
- تیک Lock Project for Viewing را انتخاب کنید.
- در کادر Password، رمز عبوری را که می خواهید برای محافظت از ماکرو استفاده کنید، وارد کنید.
- در کادر تأیید رمز عبور، برای بار دوم همان رمز عبور را وارد کنید.
- روی OK کلیک کنید.
ویرایشگر VBA را ببندید، سپس کتاب کار را ذخیره کنید. با محافظت از پروژه VBA، کاربر همچنان می تواند Ctrl+Break را برای توقف ماکرو کلیک کند، اما نمی تواند به کد برنامه واقعی برسد. آنها فقط می توانند از میان دکمه های Continue یا End انتخاب کنند که هر دو از کد شما محافظت می کنند. به عنوان یک مزیت اضافی، این رویکرد همچنین کاربر را از مشاهده کد شما با استفاده از گزینه های منو، نوار ابزار یا نوار محدود می کند.
با این حال، شاید بهترین رویکرد ایجاد یک کنترل کننده خطا باشد که اساساً هر زمان که کاربر Esc یا Ctrl+Break را فشار میدهد، شارژ را به عهده بگیرد . سپس کنترل کننده ای که اجرا می شود می تواند از کاربر بپرسد که آیا واقعاً می خواهد کار را ترک کند یا خیر، و در صورت انجام آن، به راحتی خاموش می شود. در اینجا چند نمونه کد وجود دارد که نشان می دهد چگونه این کار انجام می شود:
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
توجه داشته باشید که این مثال از روش EnableCancelKey استفاده میکند و نام برچسبی را که در صورت فشار دادن کلید لغو ( Esc یا Ctrl+Break ) باید به آن پرش کنید، اختصاص میدهد. در این حالت، ErrHandler به پرش داده می شود و از کاربر پرسیده می شود که چه کاری انجام دهد. اگر کاربر خروج را انتخاب کند، ماکرو به آرامی خاموش می شود.
توجه داشته باشید که اولین کاری که بعد از برچسب ErrHandler انجام می شود این است که بررسی کنیم که آیا خاصیت Number شی Err برابر با 18 است یا خیر. اگر اینطور است، می دانید که یک کلید لغو فشار داده شده است. اگر نه، نوع دیگری از خطا رخ داده است، و باید به هر طریقی که برای ماکرو شما مناسب است، با آن برخورد کرد.