2013-03-22 5 views
-2

다음 VBA 코드의 효율성을 향상시키고 싶습니다. 내가 생각할 수있는 것은 코드에서 "With"와 "With With"를 사용하는 것입니다. 코드를 최적화하기 위해 내가 할 수있는 일이 있습니까?다음 VBA 코드의 실행 속도를 최적화하려면 어떻게해야합니까?

감사합니다.

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 
+0

변수를 특정 형식으로 선언하면 도움이되지만 현재 선언은 각 행의 마지막 변수에만 특정 형식을 제공합니다. VBA에서는 각 변수에 형식이 필요하거나 기본적으로 Variant가됩니다. 또한 Integer 대신 Long을 사용하는 것이 좋습니다. 32,767을 초과하며 Excel 2007 이상에서는 범위가 위험합니다. 변수를 사용하여 각 시트에 대한 참조를 유지하고 두 번 이상 사용하는 모든 범위를 유지합니다. –

답변

1

For .. Next 루프를 실제로 계산해야합니까? 그렇지 않으면 처음에 Application.Calculation = xlCalculationManual으로 전환하고 끝에 한 번 계산하십시오. 코드를 실행하는 동안 계산할 필요가있는 경우 코드를 수정하여 가능한 한 작게 계산하십시오. With .. End With을 사용하면별로 도움이되지 않습니다. 만약 그렇다면.

관련 문제