Tag: aop

在VBA中,如何在没有Application.Run()的情况下从未知的模块中调用特定的方法?

我试图在VBA中即兴创build类似Drupal的钩子机制(继续批评,我知道这听起来很愚蠢)。 我努力的原因是,我没有find任何其他方式来正确地划分团队中的工作,所以借助这个机制,我希望能够带来一点Drupal的试验性和真正的钩子调用系统。 我已经做到了,它很好用,但是我有一点缺点。 以下是我所做的:一个调度程序模块,它基本上循环了我项目中的所有模块,并testing它们是否以特定的前缀(暗示它们是钩子模块)开始,当它发现它时这个: Call Application.Run(Module.Name & ".hook_" & HookName) 不是很原始,我知道,但如果我遍历所有的模块,并调用所有Workbook事件的钩子,它开始闻起来有点像AOP。 这意味着我允许任意数量的模块对Workbook_SheetChange ,而不会污染ThisWorkbook中的代码。 更好的是,不同的人将在不同的钩子模块(BIG BONUS)中使用不同的function。 正如我所说,这是有效的,但我也必须在这些调用之前调用Application.EnableEvents = False ,而在调用之后Application.EnableEvents = True ,所以我不会在无限的调用循环中结束。 这也没关系。 我的问题:我想在所有的钩子上创build一个通用的error handling程序,这样如果一个钩子把事情搞砸了,我可以捕捉到我的顶级调度程序中的错误,并重新启用事件。 听起来像一个好主意,但是因为我使用Application.Run() ,所以整个error handling机制在中间被破坏,所以调度程序将不会收到像这样调用的钩子内发生的任何错误。 这也将把应用程序事件设置为False ,这是不好的(记得在我调用钩子之前将它们设置为False )。 我的问题:是否有一种方法来调用一个没有Application.Run的未知模块内具体命名的函数,所以我的错误冒泡到调度程序? 我试过这个: Call Module.hook_WorksheetChange() 但它没有编译(我对它的成功并不屏气,但我希望…)。 在这里, Module是一个保存VBComponent的Object ,而hook_WorksheetChange()是一个在模块中定义的实际的Sub 。 想法,拜托? 让每个钩子总是处理Application.EnableEvents = True清理 – 它应该只关心它自己的特定于特定的error handling。