2016-10-07 4 views
0

このコードを最適化してより速く実行する方法のアイデアを探してください。現在のコードは動作しますが、テーブルが大きすぎてパフォーマンススピードが遅いです。VBA - どのように日付のループをスピードアップするには?

全体的なロジック:1か月の日数を決定します。ループスルーテーブル(wsUploadTable)および条件が満たされた場合は増分値。月の翌日にループして繰り返します。

例:10/1/2016、日付一致と増分値のループスルーテーブル。次の日、月2016年10月31日、ループテーブルの最後の日ティル試合のため2016年10月2日ループテーブル...は、配列に一致し、インクリメント値

'Determine DaysinMonth and assign DaysinMonth_Distro value 
DaysInMonth = DateSerial(dtTrickle_Year, dtTrickle_Month + 1, 1) - _ 
       DateSerial(dtTrickle_Year, dtTrickle_Month, 1) 
DoM_Distro = 1/DaysInMonth 

ReDim Days(1 To DaysInMonth) 
For i = 1 To DaysInMonth 
    Days(i) = DateSerial(dtTrickle_Year, dtTrickle_Month, i) 

    'Loop Upload Table and increment cell value if condition is met 
    With wsUploadTable 
    lngER_PrimaryID = .Cells(1048576, 2).End(xlUp).Row 
    For intPrimaryID = 2 To lngER_PrimaryID 
     'store current cell value 
     dblLeadsValue = .Cells(intPrimaryID, col_Upload_Leads) 
     'match UploadTable row on user input and increment new value 
      If.Cells(intPrimaryID, 3).Value = Days(i) Then 
      .Cells(intPrimaryID, 11).Value = dblLeadsValue + (x * x * DoM_Distro) 
     End If 
    Next 'Next PrimaryID 
    End With 
Next i 
+2

あなたのコードが意図したとおりに動作するが、速度が遅く、全体をより洗練されたものにしたい場合は、[codereview.se]がそうであることをご存知でしょうか。 –

+0

日付は浮動小数点数です。 1日追加するには1を加えることができます。これは 'Days(i)= DateSerial(dtTrickle_Year、dtTrickle_Month、i)'の使用を避けます。これは、多くの処理を行うように見える関数呼び出しを保存します。したがって、変数 'd'を作成します。あなたのループの 'd = d + 1'。 –

答えて

4

ストアテーブルの列(1を見つけます読み込み操作)、配列をループして計算を配列に格納し、結果値をテーブルに書き戻します(1書き込み操作)。これは、テーブルのすべての行の読み込みと書き込みよりもはるかに高速です。

+0

提案していただきありがとうございます。それをどうやって行うのか分かりませんが、あなたは私にその援助のためのガイドラインを教えることができますか? – emmanueledu

+0

SOに関する多くの例。バリアント配列を検索しよう –

関連する問題