我正在制作一个包含大量不同子项的工作簿,并且为了避免用户意外激活删除工作表代码的子项,例如,我尝试将所有子项设为私有(private)。
我的潜艇现在只能通过单击工作表上的按钮来激活,并且一切都按预期工作。当然,直到我的一个子尝试在另一个模块中调用私有(private)子。
为了解决这个问题,我使用了 Application.Run
而不是 Call
,它工作并且还允许我从前一个子中调用变量“NextSub”,这给了我一些我需要的灵 active ,并且显然无法使用 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
已经解决了我所有的问题,但是我曾经有一个叫做 errorhandler 的行,它又叫做 sub.似乎程序不能再像我使用 Call
时那样回溯到包含错误处理程序的子程序。 .是否
Applciation.Run
打破这个功能?如果是,我可以使用Call
吗?像我现在正在做的那样使用变量 NextSub?如果我不能使用 Call
那样,然后通过添加 On Error GoTo ErrorHandler
来解决所有这些问题在受影响的潜艇?我知道跨模块调用 Private Subs 的整个事情可能是非常糟糕的做法,但是当我开始时,我对此完全陌生,而且该项目过于广泛,无法在不重写所有代码的情况下解决这个问题。
最佳答案
不要将所有子程序设为私有(private),而是将 Option Private Module 放在每个模块的顶部,或者为每个例程添加一个虚拟参数:
Sub SomeHiddenRoutine(bDummy As Boolean = False)
'Routine can be called as usual using:
SomeHiddenRoutine
End Sub
关于VBA Excel 调用和运行中断回溯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44825854/