VBA Excel 调用和运行中断回溯



我正在制作一个包含大量不同子的工作簿,为了避免用户意外激活删除工作表代码的子,我尝试将所有订阅设为私有。

我的订阅现在只能通过单击工作表上的按钮来激活,并且一切都按预期工作。当然,直到我的一个子尝试在另一个模块中调用一个私人子。

为了解决这个问题,我使用了Application.Run而不是Call,这有效并且还允许我从上一个子中调用变量"NextSub",这给了我需要的一些灵活性,显然无法获得Call

例如。

Sub FirstSub()
*Something going on
Application.Run "SecondSub", SomeVariableSub
End sub
Sub SecondSub(Nextsub as String)
If something Then
   *Do something
   Application.Run NextSub
Else
   Application.Run NextSub

我以为Application.Run已经解决了我所有的问题,但我曾经有一行称为错误处理程序,而错误处理程序又称为 sub。似乎该程序无法再像我使用 Call 时那样回溯到包含错误处理程序的 sub .

Applciation.Run会破坏此功能吗?如果是,我可以像现在这样将Call与变量 NextSub 一起使用吗?如果我不能以这种方式使用Call,那么这一切都可以通过在受影响的潜艇中添加On Error GoTo ErrorHandler来解决吗?

我知道跨模块调用私有潜艇的整个事情可能是非常糟糕的做法,但是当我开始时,我对此完全陌生,而且该项目太广泛了,无法在不重写所有代码的情况下修复它。

与其将所有 sub 设为私有,不如将 Option Private Module 放在每个模块的顶部,或者为每个例程添加一个虚拟参数:

Sub SomeHiddenRoutine(bDummy As Boolean = False)
    'Routine can be called as usual using:
    SomeHiddenRoutine
End Sub

如果我知道您正在尝试调用由字符串指定的函数。

正确的方法是使用这样的东西,它允许你调用所有私有子(只要它与私有函数在同一个模块中(:

Sub CallFunction(FuncName As String)
  Select Case FuncName
    Case "Func1": Func1
    Case "Func2": Func2
    Case "Func3": Func3
  End Select
End Sub

最新更新