【问题标题】:How can I optimise the running speed of following VBA code? [closed]如何优化以下 VBA 代码的运行速度? [关闭]
【发布时间】:2013-03-22 19:12:12
【问题描述】:

我想提高跟随 VBA 代码的效率。我能想到的是在代码中使用“With”和“End With”。我还能做些什么来优化代码吗?

谢谢!

 Sub ONLY_CORP_Lives_Premiums()
Dim row_phil, row_phl, row_eveeb, row_evenb As Integer
Dim row_indiv, row_sme, row_corp As Integer
Dim row As Variant
Dim row_start, row_end As Integer
Dim i, k As Integer
Dim start_time, end_time

start_time = Now()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Sheets("SETUP").Range("J32") = Sheets("SETUP").Range("J28")

Sheets("LIVES PROJECTION").Activate
row_phil = Application.CountIf(Range("B1237:B1048576"), "PHIL" & "*")
row_phl = Application.CountIf(Range("B1237:B1048576"), "PHL" & "*") + row_phil
row_eveeb = Application.CountIf(Range("B1237:B1048576"), "EVEEB" & "*") + row_phl
row_evenb = Application.CountIf(Range("B1237:B1048576"), "EVENB" & "*") + row_eveeb
row = Array(0, row_phil, row_phl, row_eveeb, row_evenb)

For i = LBound(row) To (UBound(row) - 1)

    row_start = row(i) + 34
    row_end = row(i + 1) - 1 + 34
    row_indiv = Application.CountIf(Range("d" & row_start & ":d" & row_end), "INDIV")
    row_sme = Application.CountIf(Range("d" & row_start & ":d" & row_end), "SME")
    row_corp = Application.CountIf(Range("d" & row_start & ":d" & row_end), "CORP")
        For k = row_start + row_indiv + row_sme - 34 To row_start + row_indiv + row_sme + row_corp - 1 - 34
        With Sheets("LIVES PROJECTION")
        .Range("B12:G12").Value = .Range("B34:G34").Offset(k, 0).Value
        .Range("B12:FM26").Calculate
        End With
        Sheets("PREMIUMS PROJECTION").Range("B12:FM26").Calculate
        Sheets("LIVES PROJECTION").Range("H34:FM34").Offset(k, 0).Value = Sheets("LIVES PROJECTION").Range("H12:FM12").Value
        Sheets("PREMIUMS PROJECTION").Range("H34:FM34").Offset(k, 0).Value = Sheets("PREMIUMS PROJECTION").Range("H12:FM12").Value
        Next k
Next i
''
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Sheets("SETUP").Range("J33") = Sheets("SETUP").Range("J28")
Calculate!
end_time = Now()
Sheets("SETUP").Range("j50") = DateDiff("s", start_time, end_time)

End Sub

【问题讨论】:

  • 将变量声明为特定类型会有所帮助,但您当前的声明只为每一行的最后一个变量提供特定类型:在 VBA 中,每个变量都需要一个类型,否则默认情况下它们将是 Variant。使用 Long 而不是 Integer 也是一个好主意(它的最大值为 32,767,并且对于 Excel 2007+ 中的范围存在风险)使用变量来保存对每个工作表的引用,也适用于您多次使用的任何范围。跨度>

标签: vba optimization


【解决方案1】:

你真的需要在For .. Next 循环中计算这么多吗?没有的话,一开始就切换到Application.Calculation = xlCalculationManual,最后计算一次。如果您确实需要在代码执行期间进行计算,请尝试修改它以使其计算尽可能少。 使用With .. End With 并没有太大帮助。如果有的话。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 2021-08-28
    • 2012-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多