私は同じ製品の数(列数 - かなりの数)を持つxからyの日付(行)の有効データである小さなサプライヤの価格表を持っています。私は行を別のシートにコピーしようとしていますが、今回はcsvにエクスポートする必要がある範囲x/yの代わりに日付レベルでこの時間をコピーしようとしています。私が価格リストのフォーマットを変更することはできないという制限があるだけです。Excel VBAは非常に遅いループを実行しています
vbaコードは動作していますが、コードが実行されるまでに6000行(テスト中)に翻訳される150行(シート1)の料金表がありますが、非常に遅いです。どのようにパフォーマンスを改善できるかアドバイスできますか?私のVBAのスキルは非常に基本的なものであり、私は他の人のコードから一緒にこれを石畳みました。あなたは、テストデータを供給していますが、間違いなくあなたのコードをスピードアップします魔法のラインrngDest.Value2 = rngSrc.Value2
を見つけるでしょう#COPY THE BLOCKとしてマークされたコードに注意してくださいしていないとして、このコードを実行することが困難
Sub ExpandData()
Dim SourceRow, TargetRow As Long
Dim LastDate, NextDate As Date
Dim DateDiff, FillDate As Integer
SourceRow = 4
TargetRow = 4
'Loop through source rows
Do While Worksheets("Sheet1").Range("C" & CStr(SourceRow)).Value <> ""
LastDate = Worksheets("Sheet1").Range("F" & CStr(SourceRow)).Value
' Check for the last row of data and use todays date if last row
If Worksheets("Sheet1").Range("F" & CStr(SourceRow + 1)).Value <> "" Then
NextDate = Worksheets("Sheet1").Range("F" & CStr(SourceRow + 1)).Value
Else
NextDate = Date
End If
DateDiff = NextDate - LastDate
' create a row in the target sheet for each date in between those in the source sheet
For FillDate = 0 To DateDiff - 1
Worksheets("test").Range("A" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("A" & CStr(SourceRow)).Value
Worksheets("test").Range("B" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("B" & CStr(SourceRow)).Value
Worksheets("test").Range("C" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("C" & CStr(SourceRow)).Value
Worksheets("test").Range("D" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("D" & CStr(SourceRow)).Value
Worksheets("test").Range("E" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("E" & CStr(SourceRow)).Value
Worksheets("test").Range("F" & CStr(TargetRow)).Value = LastDate + FillDate
Worksheets("test").Range("G" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("G" & CStr(SourceRow)).Value
Worksheets("test").Range("H" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("H" & CStr(SourceRow)).Value
Worksheets("test").Range("I" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("I" & CStr(SourceRow)).Value
Worksheets("test").Range("J" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("J" & CStr(SourceRow)).Value
Worksheets("test").Range("K" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("K" & CStr(SourceRow)).Value
Worksheets("test").Range("L" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("L" & CStr(SourceRow)).Value
Worksheets("test").Range("M" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("M" & CStr(SourceRow)).Value
Worksheets("test").Range("N" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("N" & CStr(SourceRow)).Value
Worksheets("test").Range("O" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("O" & CStr(SourceRow)).Value
Worksheets("test").Range("P" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("P" & CStr(SourceRow)).Value
Worksheets("test").Range("Q" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("Q" & CStr(SourceRow)).Value
Worksheets("test").Range("R" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("R" & CStr(SourceRow)).Value
Worksheets("test").Range("S" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("S" & CStr(SourceRow)).Value
Worksheets("test").Range("T" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("T" & CStr(SourceRow)).Value
Worksheets("test").Range("U" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("U" & CStr(SourceRow)).Value
Worksheets("test").Range("V" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("V" & CStr(SourceRow)).Value
Worksheets("test").Range("W" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("W" & CStr(SourceRow)).Value
Worksheets("test").Range("X" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("X" & CStr(SourceRow)).Value
Worksheets("test").Range("Y" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("Y" & CStr(SourceRow)).Value
Worksheets("test").Range("Z" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("Z" & CStr(SourceRow)).Value
Worksheets("test").Range("AA" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("AA" & CStr(SourceRow)).Value
Worksheets("test").Range("AB" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("AB" & CStr(SourceRow)).Value
Worksheets("test").Range("AC" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("AC" & CStr(SourceRow)).Value
Worksheets("test").Range("AD" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("AD" & CStr(SourceRow)).Value
Worksheets("test").Range("AE" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("AE" & CStr(SourceRow)).Value
Worksheets("test").Range("AF" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("AF" & CStr(SourceRow)).Value
Worksheets("test").Range("AG" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("AG" & CStr(SourceRow)).Value
Worksheets("test").Range("AH" & CStr(TargetRow)).Value = Worksheets("Sheet1").Range("AH" & CStr(SourceRow)).Value
TargetRow = TargetRow + 1
Next FillDate
SourceRow = SourceRow + 1
Loop
End Sub
あなたが行っていますを介して[この質問](http://stackoverflow.com/questions/20738373/can-i-make-this-macro-more-efficient-or-faster)マクロを高速化する? – Spidey
あなたはセルごとにセルを塗りつぶします。なぜセルのブロックではないのですか? Range( "A"&TargetRow).Value =範囲( "A"&SourceRow& ":E"&SourceRow).Value'およびGからAHへの範囲です。そして、行を文字列に変換する必要はありません。 – CommonSense
上記のパーツを使用していただきありがとうございますVB –