|
こんにちは。
行の追加・削除をともなうループは後ろから処理するのが定石です。
まずは、うまくいかない例を説明します。
たとえば、A1:A3に「い」「ろ」「は」と入っているとします。
1行目からループして「ろ」があったら、その行をコピー挿入するとします。
すると2行目で「ろ」が見つかるので、コピー挿入。
するとA1:A4が「い」「ろ」「ろ」「は」になる。
iに1を足して3行目をみると「ろ」があるのでコピー挿入。
するとA1:A5が「い」「ろ」「ろ」「ろ」「は」になる。
iに1を足して4行目をみると「ろ」があるのでコピー挿入。
するとA1:A6が「い」「ろ」「ろ」「ろ」「ろ」「は」になる。
iに1を足して5行目をみると「ろ」があるのでコピー挿入。
するとA1:A7が「い」「ろ」「ろ」「ろ」「ろ」「ろ」「は」になる。
以下、ずーっと続く。
後ろから処理した場合は、2行の目の「ろ」を処理したら つぎは
1行目の「い」で、「該当せず」。ループ終了です。
後ろから処理しようにも最終行が分からない、と推察します。
データの最終行を調べるコードは、
Cells(i,1).End(xlDown).Row です。
(おまじない的に使わずに、コードの意味をちゃんとヘルプで調べて下さいね。
ヘルプの説明だけでは不十分と感じたらネットでも調べて下さい。)
▼[名前なし] さん:
>i = 2
> Do While Cells(i, 1) <> ""
> If Cells(i, 21) <> "" Then
> Rows(i).Select
> Selection.Copy
> Selection.Insert Shift:=xlDown
> Range(Cells(i, 20), Cells(i, 44)).Select
> Application.CutCopyMode = False
> Selection.ClearContents
> Range(Cells(i + 1, 20), Cells(i + 1, 44)).Cut Destination:=Range(Cells(i + 1, 15), Cells(i + 1, 39))
> End If
> i = i + 1
> Loop
>
>上の記述だと、END if前の切り抜き→貼り付け(実際には元データのセルを左にずらしている処理)
>で応答なしになってしまいます。
>完全に初心者ですが、ご指摘お願いします。
|
|