让一个Sub除了调用其他Subs之外什么都不好?

时间:2018-06-07 13:22:22

标签: 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

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

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

2 个答案:

答案 0 :(得分:13)

如果您在CR上发布了实际的实际代码,那么您可以获得更多帮助&有意义的答案。

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

从实用的角度来看,您所获得的内容与任何其他过程中的任何其他可执行语句系列没有任何不同:任何可执行语句都将调用的成员在某一点上。

将20个宏内联到这个" god程序"和将它们像你一样拆分之间的区别是抽象 - key concepts of object-oriented programming中的一个。

你是否有好的抽象是不可能用这些假名称来判断的,并且不知道具体是什么问题正由所有这些宏解决, 正是Code的原因评论希望看到您的真实代码,以及为什么:

  

我想我一直在寻找共识的答案,或者是#34;是的,那很好。"或者"不,这样做会更好。"

无法使用假设的Macro1...Macro20存根码。

如果宏之间的交互使得它们之间的全局状态发生变化并且执行顺序至关重要,那么您所获得的内容很糟糕,因为您已经隐式 时间耦合:如果执行顺序发生变化,事情就会崩溃/中断 - 就像你Activate一个单元格然后解决ActiveCellSelection一样,就像宏录制器代码一样。

所以如果不是这样的话:

OpenFiles
ProcessNewData
GenerateReports
SaveCSVs
'...

你有这个:

Set files = OpenFiles
Set reportData = ProcessNewData(files, targetBook)
Set reports = GenerateReports(reportData)
SaveCSVs(reports)

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

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

答案 1 :(得分:2)

没有什么"错误"在使用主宏调用其他人时,请考虑:

Sub Suggestion()
    For i = 1 To 20
        Application.Run "Macro" & i
    Next i
End Sub

您可以通过创建String变量数组来扩展这个想法。每个数组都是一系列宏调用。

修改#1:

"真实"的一个例子宏名称:

Sub NextSuggestion()
    arry = Array("OpenFiles", "ProcessNewData", "GenReports", "SaveCSVs")
    For Each a In arry
        Application.Run a
    Next a
End Sub