2017-02-17 179 views
0

何か不明な理由でcopyfromrecordsetを中断する2つの列に対してcopyfromrecordsetの代わりにループを使用しています。これをループすると、800行を実行するのに2分以上かかりますが、これは非常に遅いようです。 Copyfromrecordsetは、20秒未満で10倍の列数で800行を入力できます。誰かがループをとても遅くしていると言うことができますか?遅いVBAループ - レコードセットから貼り付け

Set rng = Activesheet.Range("P2") 
Row = 0 
Do While Not Rs1.EOF 
    For col = 0 To Rs1.Fields.Count - 1 
      rng.Offset(Row, col).Value = Rs1(col) 
    Next col 
    Row = Row + 1 
    Rs1.MoveNext 
Loop 
+1

レコードセット内の個々のフィールドにアクセスしているため、個々のフィールドごとにワークシートが更新されているため、処理が遅くなります。 ( 'CopyFromRecordset'は、単一の転送ステップでワークセット全体にレコードセットを転送するだけです。) – YowE3K

+1

' CopyFromRecordset'を試したときに単一のセルアドレスを使用していましたか? 'CopyFromRecordset'は、範囲がレコードセットのサイズに関係なく、左上のセルを参照する場合に最も効果的です。 'CopyFromRecordset'が問題を引き起こしている場合は、データを配列として返す' GetRows'関数を考えてみましょう。配列を転置して*全体配列を1ステップで挿入する必要があります。 – ThunderFrame

+0

私はこの提案の大ファンです^^^^^^ –

答えて

1

@ThunderFrameのおかげで、私は私の問題を解決することができました。 @ YowE3kが言ったように、私の質問は一度に一つのことをやっていた。だから、私は.getrowsを使用するようにコードを変更します。

'Pasting data Headings then Values 
    ArrRs1 = Rs1.GetRows 
    For intColIndex = 0 To Rs1.Fields.Count - 1 
     Range("A1").Offset(0, intColIndex).Value = Rs1.Fields(intColIndex).Name 
    Next 

    Dim PasteArray As Variant 

    ReDim PasteArray(1 To UBound(ArrRs1, 2), 0 To UBound(ArrRs1, 1)) 
    For i = 1 To UBound(ArrRs1, 2) 
     For j = 0 To UBound(ArrRs1, 1) 
      PasteArray(i, j) = ArrRs1(j, i) 
     Next 
    Next 

'This is pasting the data 
     ActiveSheet.Range("A2").Resize(UBound(PasteArray, 1) + 1, UBound(PasteArray, 2) + 1) = PasteArray 
0

私はcopyfromrecordsetで多くの経験がありません。ただし、各行でスクリーン更新が行われている場合は、それをオフにしてスピードの向上が見込まれる可能性があります。以前はDo Until/Loopを手伝ってくれました。

また、数多くの数式を含む巨大なスプレッドシートでは、計算をオフにします。 Excelに計算が自動的に更新されるコードにコードが含まれていると、ワークブックの再計算によって処理速度が低下する可能性があります。

application.screenupdating = false 
Application.Calculation = xlCalculationManual 

'your code' 

application.screenupdating = true 
Application.Calculation = xlCalculationAutomatic 
関連する問題