2016-11-30 2 views
1

私は、問題を再現するために、簡単なコードを書いた:VBA:画面が連続してコピーして貼り付けた後、数秒間フリーズ

Sub test() 
    Application.ScreenUpdating = False 
    Application.Calculation = xlCalculationManual 
    For i = 1 To 1000 
     Range("A" & i).Copy Destination:=Range("B" & i) 
    Next 
    Application.ScreenUpdating = True 
    Application.Calculation = xlCalculationAutomatic 
End Sub 

プログラムが完了した後、私は、上記のプログラムブロックを実行した場合、画面が約5秒間フリーズしてから、コントロールがユーザーに解放されます。

コードのコピー回数をコードの1000から他の値に変更すると、フリーズ時間がコピー数に比例することがわかります。

これは私のコンピュータの問題ですか、実際はすべてのコンピュータで発生しますか?これをどうすれば解決できますか?

+0

以下、それについての記事へのリンクは良いあなたはそれがない時に、後にフリーズしますか? – GSerg

+0

はい、ループの後にポップアップするユーザーフォームを追加しようとしました。 5秒後にユーザーフォームを閉じることができます。 – Pingu

+0

計算されているかもしれませんが、実際に反復回数に依存する必要はありません。しかし、自動計算を無効にしてみてください。 – GSerg

答えて

1

私はこれがコンピュータに孤立している問題ではないと思っています。計算で同様の遅延時間が発生します(正しいことを指摘したように、反復の上限に比例します)。残念ながらコピーや貼り付けを繰り返すだけの結果ですが、これは(私が気づいた)VBAで行うことは、ほとんどの場合よりも時間がかかり、最終的にはコードが遅くなるためです。

Sub test() 
    Application.ScreenUpdating = False 
    Application.Calculation = xlCalculationManual 
    For i = 1 To 1000 
     'Range("A" & i).Copy Destination:=Range("B" & i) 
     Cells(i, 2).Value = Cells(i, 1).Value 
    Next 
    Application.ScreenUpdating = True 
    Application.Calculation = xlCalculationAutomatic 
End Sub 

技術的にそれはあなたのコードとまったく同じことを行いますが、コピーせずに:何試してみる価値があるかもしれないことは次のようです。私はこれがあなたの実際の仕事(この例とは対照的に)にどのように関係するかはわかりませんが、私のマシン上で実行するのが速いことがわかります。

基本的には、大きな反復でのコピーや貼り付けはVBAの停止が遅いということですが、私のアドバイスは可能な限り回避することです。 :)

http://www.ozgrid.com/VBA/SpeedingUpVBACode.htm

+0

はい、本当にこの方法でコピーが速いです、それは今よりはるかに良い:) :)ありがとう – Pingu

関連する問題