有一个Sub除了调用其他Subs之外什么都没有?

Rob*_*bby 0 excel vba excel-vba

我之前在Code Review中发布了这个,我想这不是正确的地方.希望这是.

我已经为Excel工作表订单表单的各种操作创建了几十个Subs.每天都有数百个这样做,必须检查很多东西.

例程是当有人打开其中一个工作表时,他们做的第一件事就是运行一个调用其他几个工作表的宏.所以它基本上是这样的:

Sub AllMacros()
Call Macro1
Call Macro2
Call Macro3
Call Macro4
Call Macro5
Call Macro6
Call Macro7
Call Macro8
Call Macro9
Call Macro10
Call Macro11
Call Macro12
Call Macro13
Call Macro14
Call Macro15
Call Macro16
Call Macro17
Call Macro18
Call Macro19
Call Macro20
End Sub
Run Code Online (Sandbox Code Playgroud)

我这样做是因为有时只需要运行其中一个Subs,因此它们将被单独执行.

我的主要问题是:这种技术本身不是一个好主意吗?我知道我没有显示所有代码,但这不是重点.在这里发布的代码太多了.我想我正在寻找共识的答案是"是的,没关系." 或者"不,这样做会更好."

Mat*_*don 13

如果您在CR上发布了实际的实际代码,那么您将获得更有帮助且更有意义的答案.

从设计的角度来看,你所拥有的是一个"协调员",其作用是以特定的顺序调用其他程序,这本身并不坏.

从实际的观点来看,你所得到的是不是比其他任何程序的任何其他一系列可执行语句的任何不同:任何可执行语句将被调用的成员的东西在一个点或另一个.

将20个宏内联到这个"​​神程序"中,并将它们像你一样拆分它们之间的区别在于抽象 - 面向对象编程关键概念之一.

无论你是否有良好的抽象是不可能告诉这样的假名字和具体不知道是被所有这些宏解决什么问题,也正是为什么代码审查要见你真正的代码,为什么这样的:

我想我正在寻找共识的答案是"是的,没关系." 或者"不,这样做会更好."

用假设的Macro1...Macro20存根代码是无法回答的.

如果宏之间的交互使得它们之间的全局状态发生变化并且执行顺序很关键,那么你得到的就是坏的,因为你有隐式的 时间耦合:如果执行顺序发生变化,事情就会崩溃/ break - 就像你在Activate一个单元格然后工作一样,ActiveCell或者Selection像宏录制器代码一样.

所以,如果不是这样:

OpenFiles
ProcessNewData
GenerateReports
SaveCSVs
'...
Run Code Online (Sandbox Code Playgroud)

你有这个:

Set files = OpenFiles
Set reportData = ProcessNewData(files, targetBook)
Set reports = GenerateReports(reportData)
SaveCSVs(reports)
Run Code Online (Sandbox Code Playgroud)

您可以使时间耦合更加明确,消除了以错误顺序执行其中一个宏的机会,并消除了全局状态.

你的答案是"这取决于你的真实代码是什么样的".

  • 优秀的评论.............它们一般适用于软件设计,而不仅仅是这个具体的例子 (2认同)