代码之家  ›  专栏  ›  技术社区  ›  Ans

Excel vba:打开工作簿时会指定全局变量;如果发生错误,则会将其删除

  •  1
  • Ans  · 技术社区  · 6 年前

    我有一个工作簿,其中声明了全局变量:

    Public var1 As Long
    Public var2 As Long
    Public var3 As Long
    ...
    Public varN As Long
    

    我还有一个工作簿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
    

    很好用。不过,我还有一个工作表选择更改子项:

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    ...
    End Sub
    

    和工作表更改子项:

    Private Sub Worksheet_Change(ByVal Target As Range)
    ...
    End Sub
    

    我该怎么做才能保证它不会发生?使用“On Error GoTo”操作就足够了吗?为什么全局变量会被删除呢?

    1 回复  |  直到 6 年前
        1
  •  6
  •   this    6 年前

    如评论中所述,单击 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
    

    注意无法到达的地方 Resume Resume ExitProcedure 总是先执行。所以当你得到messagebox时,你可以使用 ctrl+break 破译成代码,然后带你到 继续退出程序 . 然后可以将黄色箭头拖到无法到达的位置 ,按F8键执行一次步骤,然后返回导致错误的行。

    或者,如果你不喜欢所有额外的工作,你可以考虑购买一个插件,如 vbWatchDog

    即便如此,这些都无助于解决根本问题——全球国家是脆弱的,可以被摧毁。。。有停止按钮,甚至 终点 为您提供。您希望尽可能避免使用global,并对它们进行范围限定或将它们填充到类实例中,以便在重复代码块时,它可以在该范围内重建状态。你在全球拥有的东西越少越好。