当开发宏供其他人使用时,您可能希望添加一种方法供用户在宏结束之前退出宏,并且仍然保留对宏功能的控制。 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编辑器中按照以下步骤进行操作:

。从工具菜单中选择VBAProject属性选项。编辑器显示“项目属性”对话框。

。确保显示了“保护”选项卡。 (请参见图1。)

。选择锁定项目查看复选框。

。在“密码”框中,输入要用于保护宏的密码。

。在“确认密码”框中,再次输入相同的密码。

。单击确定。

关闭VBA编辑器,然后保存工作簿。在VBA项目受保护的情况下,用户仍然可以单击Ctrl + Break停止宏,但是他们将无法获得实际的程序代码。他们只能从“继续”或“结束”按钮中进行选择,这两个按钮都可以保护您的代码。另外一个好处是,这种方法还限制用户通过使用菜单,工具栏或功能区选择来查看代码。

但是,也许最好的方法是创建一个错误处理程序,该错误处理程序实际上将在用户按下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标签之后要做的第一件事是检查Err对象的Number属性是否等于18。如果是,则知道按下了取消键。如果不是这样,则发生了其他类型的错误,应以适合于您的宏的任何方式对其进行处理。

注意:

如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(3021)适用于Microsoft Excel 97、2000、2002和2003。可以在以下功能区中为Excel的功能区界面(Excel 2007及更高版本)找到本技巧的版本: