VBA性能问题在主子系统中调用多个子系统

VBA性能问题在主子系统中调用多个子系统,vba,excel,Vba,Excel,我有一个模块,里面有几个潜艇。大概是这样的: Sub Main() Call ReadData '12 seconds Call SortData '8 seconds Call RemoveDupes '30 seconds End Sub 这个主Sub是从Userform调用的,总共需要2m运行。然而,如果我单独调用sub,我会得到上面代码中显示的时间 经过多次测试后,我意识到问题发生在调用最后一个sub时。它从30秒变为

我有一个模块,里面有几个潜艇。大概是这样的:

    Sub Main()

    Call ReadData      '12 seconds
    Call SortData      '8 seconds
    Call RemoveDupes   '30 seconds

    End Sub
这个主Sub是从Userform调用的,总共需要2m运行。然而,如果我单独调用sub,我会得到上面代码中显示的时间

经过多次测试后,我意识到问题发生在调用最后一个sub时。它从30秒变为大约1M40秒,没有明显的原因。我对Main Sub上的第三个调用进行注释,当它结束时,我直接从VBA编辑器窗口手动调用它,并返回到30秒

这样的事情为什么会发生

提前非常感谢


附言:每个子系统的代码都有点长,所以我没有发布它们,但是它们非常简单,一点也不复杂。顺便说一句,我使用的是Excel 2010。

VBA在完成VBA程序/宏的运行后,会清除许多未解决的问题。首先,它返回程序使用的所有内存。如果您注释掉对RemoveDupes的调用,程序将在sortData之后结束,此清理过程将发生。然后使用干净的板岩手动运行RemoveDupes


检查是否在前两个子模块中创建了许多/大型集合或其他对象,这些集合或对象在子模块的末尾没有设置为空。我认为它们必须在模块的顶部声明,然后才能为任何子模块或函数编写代码。

谢谢Rich,这正是发生的情况。我声明了一些公共变量,但我在第一个子节点上使用它们,而不是在最后一个子节点上使用它们。我会努力的。我不知道为什么这个答案被记下来了,但里奇说得对。不正确的变量清理会大大降低代码的速度,尤其是在对象的情况下。更进一步,您可以将变量清理变得更容易一些,方法是将它们全部存储在一个集合中,然后在该集合中循环以清理它们(只有在有多个变量的情况下),不要只为几个变量执行此操作。此外,如果您正在从多个工作簿中读取数据,请确保在获得数据后关闭工作簿。这也会让事情变得更好。