| 
    
     |  | ▼タケル さん: 
 こんにちは
 
 >もう少しこうしたほうが処理が速くなるとか、
 >何かアドバイスがいただければ幸いです。
 
 エクセルのシート上の処理で結構時間がかかるのは、セルへの書き込み行為、
 それと、書き込んだ内容を今見えているエクセルの画面に反映させるための再描画処理です。
 
 たとえば
 
 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
 
 
 |  |