2013-03-16 4 views
1

현재 재고 투자 수익을 계산 중입니다. 나는 약 10 년 동안의 역사적인 데이터를 가지고 있으며, 나의 기능을 구축 한 방법은 그 일을 오래 수행하는데 시간이 걸린다. 예를 들어 각 날의 수익을 계산하기 위해 11 개의 열과 2872 개의 행이 있습니다.Excel VBA에서 계산 속도가 느립니다.

my Function 
    Public Sub CalcROI(ByVal ColPick As Integer, ByVal ColPrint As Integer) 

    Dim irow As Integer 
    Dim iCol As Integer 

    For irow = 4 To 2873 
    'Calculating ROI 
     Cells(irow + 1, ColPrint).Value = (Cells(irow + 1, ColPick).Value - Cells(irow, ColPick).Value)/Cells(irow, ColPick).Value 
     Next irow 

     End Sub 

및 절차의 구현은

CalcROI ColPick:=4, ColPrint:=17 

ColPick입니다 - 가치 계산에

ColPrint을 선택해야하는 곳에서 - 그 필요가 출력

+0

질문에 질문이 없습니다! 속도를 높이고 싶다고 생각합니다. 계산에서 +1을 꺼내고 For 매개 변수를 5에서 2784로 변경하지만 수식을 스프레드 시트에 넣지 않는 이유는 무엇입니까? – grahamj42

+0

나는 VBA 메뉴 구동 프로그램을 사용하여 동적으로 작업을 수행하기 때문에 ... 기본적으로 가치가있는 위험을 계산하고 있습니다 - 과거의 방법과 그 정보가 블룸버그 터미널에서 나오고 있습니다 ... 위는 VaR caclulation –

+0

처음에'Application.Screenupdating = false'를 추가하여 현재 코드를 크게 향상시킬 수 있습니다. – enderland

답변

1

I를 인쇄 할 수있는 컬럼에 어제 다른 질문에서 본 것을 시험하고 싶었습니다. 테스트를하는 경우, 끔찍하게 잘못 될 경우를 대비하여 복사본을 통합 문서로 실행하십시오!

내가 (무작위 숫자> 0의 열을 사용)를 테스트 한하고 작업을 수행

업데이트.

Public Sub CalcROI(ByVal ColPick As Integer, ByVal ColPrint As Integer) 
Dim rgPick As Range 
Dim vaPick As Variant 
Dim rgPrint As Range 
Dim vaPrint As Variant 
Dim Row As Integer 

    Set rgPick = Range(Cells(4, ColPick), Cells(2873 + 1, ColPick)) 
    vaPick = rgPick.Value 

    Set rgPrint = Range(Cells(4, ColPrint), Cells(2873 + 1, ColPrint)) 
    vaPrint = rgPrint.Value 

    For Row = LBound(vaPick) To UBound(vaPick) - 1 
     vaPrint(Row + 1, 1) = (vaPick(Row + 1, 1) - vaPick(Row, 1))/vaPick(Row, 1) 
    Next Row 

    rgPrint = vaPrint 

End Sub 

Answer 나는 참조.

+0

당신은 스타 맨입니다 ... 그것은 치료를 ... 아주 고마워요. –

0

현재 코드를 변경하고 싶지 않은 경우 Application.ScreenUpdating을 사용하면 거의 모든 향후 Excel VBA 코드를 더 빠르게 실행할 수있을뿐만 아니라이 작업을 수행하는 데 도움이됩니다.


Public Sub CalcROI(ByVal ColPick As Integer, ByVal ColPrint As Integer) 
    'this stops Excel from updating the screen after every single iteration in your loop 
    'in the future, this is an EASY way to speed up the majority of Excel macros 
    Application.screenupdating = false 
    Dim irow As Integer 
    Dim iCol As Integer 

    For irow = 4 To 2873 
    'Calculating ROI 
     Cells(irow + 1, ColPrint).Value = (Cells(irow + 1, ColPick).Value - Cells(irow, ColPick).Value)/Cells(irow, ColPick).Value 
     Next irow 
     'this isn't strictly speaking necessary, but will help 
     application.screenupdating = true 
     End Sub