VBA循环范围太大-需要其他选择

VBA循环范围太大-需要其他选择,vba,excel,Vba,Excel,我在最后一节“计算分配的逻辑”中寻找以下代码的帮助。我正在寻找各种SUMIF除以COUNTIF的方法,用于一个范围单元,它跨越大约30k行和超过20列。我只对一个专栏进行了测试,它提供了我预期的结果,但时间有点不合理。我已经修改了vba,使其可以在范围的每一列中的所有单元格中运行,但我必须关闭它,因为它已经运行了10分钟,没有输出。我读过关于使用阵列的不同解决方案,但这是我没有学到的,并且在应用发布到该场景中的一些解决方案的概念时遇到了困难。我正在寻找这部分逻辑的改进,以帮助提高输出的效率和时间

我在最后一节“计算分配的逻辑”中寻找以下代码的帮助。我正在寻找各种SUMIF除以COUNTIF的方法,用于一个范围单元,它跨越大约30k行和超过20列。我只对一个专栏进行了测试,它提供了我预期的结果,但时间有点不合理。我已经修改了vba,使其可以在范围的每一列中的所有单元格中运行,但我必须关闭它,因为它已经运行了10分钟,没有输出。我读过关于使用阵列的不同解决方案,但这是我没有学到的,并且在应用发布到该场景中的一些解决方案的概念时遇到了困难。我正在寻找这部分逻辑的改进,以帮助提高输出的效率和时间。提前谢谢

Sub Alloc_Entity()

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False




'-----Logic to calculate allocation---------

Dim GLcell As Range, GLAllocRg As Range, c As Range


    Set GLAllocRg = MainWk.Range(MainWk.Cells(fRow, fGLCol), MainWk.Cells(lRow, lCol)) '------used for testing

    For Each c In GLAllocRg
        c = ((WorksheetFunction.SumIfs(AmtRg, TypeRg, "Entity", TransGLRg, MainWk.Cells(GLrow, c.Column).Value, EntPIRLocRg, "Acquisition Company", EntPIRValueRg, MainWk.Cells(c.Row, AcqCoCol).Value) / WorksheetFunction.CountIfs(AcqCoRg, MainWk.Cells(c.Row, AcqCoCol).Value))) _
        + (WorksheetFunction.SumIfs(AmtRg, TypeRg, "Entity", TransGLRg, MainWk.Cells(GLrow, c.Column).Value, EntPIRLocRg, "Property Manager", EntPIRValueRg, MainWk.Cells(c.Row, PMCol).Value) / WorksheetFunction.CountIfs(PMRg, MainWk.Cells(c.Row, PMCol).Value)) _
        + (WorksheetFunction.SumIfs(AmtRg, TypeRg, "Entity", TransGLRg, MainWk.Cells(GLrow, c.Column).Value, EntPIRLocRg, "Market", EntPIRValueRg, MainWk.Cells(c.Row, MarketCol).Value) / WorksheetFunction.CountIfs(MarketRg, MainWk.Cells(c.Row, MarketCol).Value)) _
        + (WorksheetFunction.SumIfs(AmtRg, TypeRg, "Entity", TransGLRg, MainWk.Cells(GLrow, c.Column).Value, EntPIRLocRg, "State", EntPIRValueRg, MainWk.Cells(c.Row, StateCol).Value) / WorksheetFunction.CountIfs(StateRg, MainWk.Cells(c.Row, StateCol).Value))

    Next






Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True


End Sub

代码优化更适合coderview。坦率地说,这是太多的代码。你应该把它减少到显示你的问题的最小值。建议:给每个部分计时。每一行之间需要多长时间?每个
循环的
之一是否比其他循环慢?此外,打印您必须处理的单元格数量,以查看哪里可以获得最大的成本效益。此外,如果您所做的只是查找单元格,然后基于这些单元格应用工作表函数,那么您可能能够消除VBA,并使用
VLOOKUP
和friends在工作表上进行所有计算。我想这样会更快,但不确定。谢谢你的评论。问题是在最后一个为每个循环计算分配的逻辑部分-----下。上面的其他部分是声明范围、变量和工作表。如果您对代码的任何/所有方面(包括但不限于性能、可读性和可维护性)的反馈感兴趣,请将完整的代码带到,我们将很高兴地将其拆分,以帮助您改进!=)代码优化更适合coderview。坦率地说,这是太多的代码。你应该把它减少到显示你的问题的最小值。建议:给每个部分计时。每一行之间需要多长时间?每个
循环的
之一是否比其他循环慢?此外,打印您必须处理的单元格数量,以查看哪里可以获得最大的成本效益。此外,如果您所做的只是查找单元格,然后基于这些单元格应用工作表函数,那么您可能能够消除VBA,并使用
VLOOKUP
和friends在工作表上进行所有计算。我想这样会更快,但不确定。谢谢你的评论。问题是在最后一个为每个循环计算分配的逻辑部分-----下。上面的其他部分是声明范围、变量和工作表。如果您对代码的任何/所有方面(包括但不限于性能、可读性和可维护性)的反馈感兴趣,请将完整的代码带到,我们将很高兴地将其拆分,以帮助您改进!=)