Ans*_*Ans 1 excel vba excel-vba
我有一个声明了全局变量的工作簿:
Public var1 As Long
Public var2 As Long
Public var3 As Long
...
Public varN As Long
Run Code Online (Sandbox Code Playgroud)
我还有一个工作簿open sub,它在打开工作簿时为全局变量赋值:
Private Sub Workbook_open()
Application.Calculation = xlCalculationAutomatic
Call calculateRows
Call assignVariables
ThisWorkbook.Worksheets("Filling").Protect "somepass", UserInterfaceOnly:=True
MsgBox ("DONE Workbook_open")
End Sub
Run Code Online (Sandbox Code Playgroud)
它工作正常.但是,我还有一个工作表选择更改子:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
...
End Sub
Run Code Online (Sandbox Code Playgroud)
和工作表更改子:
Private Sub Worksheet_Change(ByVal Target As Range)
...
End Sub
Run Code Online (Sandbox Code Playgroud)
两者都包含可能最终出错的代码.无论发生什么错误,它总是擦除我的全局变量的值,这只会导致进一步的错误,并且基本上完全关闭工作簿,因为所有工作表选择/更改子都大量使用这些全局变量.
我该怎么做以确保它不会发生?使用'On Error GoTo'操作就足够了吗?为什么全局变量会被删除呢?
如评论中所述,单击End暂停执行将始终重置全局状态.哎呀,不需要出错; 单击"停止"按钮将具有相同的效果.
您应该至少在输入过程中进行错误处理(例如,您的工作表事件处理程序是很好的候选者,因为它们是Excel可以与您的VBA代码交互的入口点).
如果您希望即使使用错误处理程序也能找到有问题的错误,此模式可以帮助:
Public Sub Example()
On Error GoTo ErrHandler
'Some code that might error
ExitProcedure:
On Error Resume Next
'Clean up
Exit Sub
ErrorHandler:
MsgBox "Oops"
Resume ExitProcedure
Resume 'for debugging
End Sub
Run Code Online (Sandbox Code Playgroud)
请注意Resume错误处理程序末尾的无法访问.它无法访问,因为它Resume ExitProcedure总是先执行.因此,当您获得消息框时,您可以使用ctrl+break闯入代码,然后将您带到Resume ExitProcedure.然后,您可以将黄色箭头拖到无法到达的位置Resume,按F8键一步,然后将您带回导致错误的行.
请注意,它仅适用于程序; 如果错误被冒泡,它将返回到错误冒泡之前调用的过程,但不返回过程中的行.
或者,如果您不喜欢所有额外的工作,您可以考虑购买vbWatchDog这样的插件,这有助于显着处理错误.
即便如此,那些根本问题也没有帮助 - 全球状态是脆弱的,可以被破坏......有停止按钮甚至End可供你使用.您希望尽可能避免使用全局并将它们作为范围或将它们填充到类实例中,以便在重复代码块时,它可以重建该范围内的状态.你在全球状态下拥有的东西越少越好.