| 
    
     |  | ▼[名前なし] さん: 
 よこから失礼します。
 
 ご提示のコードより、
 1. 無駄な Select Selection を取る
 2. 範囲を読みやすくする↓
 たとえば
 > Range(Cells(i, 20), Cells(i, 44))
 を
 Cells(i, 20).Resize(, 25)
 のように Resizeを使って表現する
 と、
 Sub QQ2()
 のようになります。これ上から処理していってるわけですね。
 
 Sub QQ2()
 Dim i&
 i = 2
 Do While Len(Cells(i, 1).Value) > 0
 If Len(Cells(i, 21).Value) > 0 Then
 Rows(i).Copy
 Rows(i).Insert
 Cells(i, 20).Resize(, 25).ClearContents
 Cells(i + 1, 20).Resize(, 25).Cut _
 Destination:=Cells(i + 1, 15)
 i = i + 1 '★追加
 End If
 i = i + 1
 Loop
 
 End Sub
 
 いっぽう、下からFor〜Nextで処理しようとすると
 一例としてつぎのようになるかと思います。
 
 Sub QQ3()
 Dim i As Long
 Dim iLast As Long
 
 iLast = Cells(Rows.Count, 1).End(xlUp).Row
 For i = iLast To 2 Step -1
 If Not IsEmpty(Cells(i, 21).Value) Then
 Rows(i).Copy
 Rows(i).Insert
 With Cells(i, 20).Resize(, 25)
 .ClearContents
 .Offset(1).Cut Cells(i + 1, 15)
 End With
 End If
 Next
 End Sub
 
 で、上から(QQ2) でも 下から(QQ3) でも、こういう一行づつ
 処理していたのでは画面がチラチラしてあまり処理効率がよくないと
 思います。
 
 
 分らないのは、
 
 >      Rows(i).Copy
 >      Rows(i).Insert
 
 で同じ行を複製しているので、A列から N列? までのデータが
 ダブルになりますけど?
 
 これは ほんとうは どういうことをしたかったんでしょう。
 それを再確認してから、手段を考えても遅くはないと思いますが。
 
 ある範囲のデータを一行おきに移動したかったんですか?
 一行おきに空白行を入れたいときは ソートを使う方法もありますよ。
 
 |  |