|
▼タケル さん:
こんにちは
>もう少しこうしたほうが処理が速くなるとか、
>何かアドバイスがいただければ幸いです。
エクセルのシート上の処理で結構時間がかかるのは、セルへの書き込み行為、
それと、書き込んだ内容を今見えているエクセルの画面に反映させるための再描画処理です。
たとえば
Range("A1").Value = Range("D1").Value
Range("B1").Value = Range("E1").Value
こんなコードがあった場合、書き込みが2回、再描画が2回発生します。
これを
Range("A1:B1").Value = Range("D1:E1").Value
こうしますと、書き込みは1回、再描画も1回になりますので処理時間も短くなります。
さらに、プロシジャの先頭で
Application.ScreenUpDating = False と宣言しておきますと
エクセルによる再描画処理が休眠状態になりますので、実際の書き込み処理に要する時間だけで処理可能です。
で、お約束として、プロシジャの最後に
Application.ScreenUpDating = True
こうして、再描画を再開させます。
この時に、今まで休眠していた再描画機能が目を覚まして1回だけ、画面に再描画します。
(Application.ScreenUpDating は、ほぉっておいても、End Sub でリセットされますが)
2003までであれば、このApplication.ScreenUpDating による処理記述で、処理時間は、おおよそ半減でした。
残念ながら、2007以降は、セルへの書き込み負荷に比べて再描画負荷が小さいので、この手当をしても
しない場合より、わずかにまし ぐらいなんですが。
それより、セルへの書き込み回数を減らす方が効果が大きいですね。
極端に言えば1回だけにするとか。
そうすると、再描画のことも気にする必要はなくなります。
ただ、これは猛さんにとっては、なかなか簡単ではないかもしれません。
>それから、sheet1にデータがなくなったときに
>処理を終わらせるためには、どうしたらよろしいでしょうか?
A2からはじめて、A列のデータ最終まで繰り返す場合の基本的な構文を以下に2つほど。
一般にはSample1の形ですね。まずは、これらをしっかりと理解してください。
Sub Sample1()
Dim maxRow As Long
Dim i As Long
maxRow = Range("A" & Rows.Count).End(xlUp).Row 'A列最終行番号
For i = 2 To maxRow
' i 行目 の処理
Next
End Sub
Sub Sample2()
Dim i As Long
i = 2
Do While Cells(i, "A").Value <> "" 'A列のセルが空白になるまで実行
' i 行目 の処理
i = i + 1
Loop
End Sub
|
|