|
▼[名前なし] さん:
よこから失礼します。
ご提示のコードより、
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列? までのデータが
ダブルになりますけど?
これは ほんとうは どういうことをしたかったんでしょう。
それを再確認してから、手段を考えても遅くはないと思いますが。
ある範囲のデータを一行おきに移動したかったんですか?
一行おきに空白行を入れたいときは ソートを使う方法もありますよ。
|
|