- ベストアンサー
Excel 行削除ループさせたい
あるデータシートのB列に変数と同じものがあったらその行を削除したいです。 ところが下のようなFor文だと、行を削除した後にFor文の行番号が動いてしまうので、削除できないデータが残ってしまいます。 (1,2行目が削除対象行の場合、1行目を削除した時点で2行目が1行目のところにくるのでFor文から外れる) ループ文をネストさせたりいろいろやってみましたが 上手くいきません。 なにか良い方法は無いでしょうか? ’ラスト行はデータが入っている最後の行 For Each Myrange In シート名.Range("b6:b" & ラスト行) If Myrange.Value = 変数 Then nowrow = Myrange.Row シート名.Rows(nowrow).Delete End If Next
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
Myrangeをオブジェクト変数にして、上から操作しているのに難があると思います。 こんな感じで如何でしょうか。 Dim nowrow As Long For nowrow = ラスト行 To 6 Step -1 If Worksheets("シート名").Range("B" & nowrow).Value = 変数 Then Worksheets("シート名").Rows(nowrow).Delete End If Next
その他の回答 (3)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
>baseにrange("b6")のValueが入っちゃって、… >range形式の変数がよくわかってません。 Dim base As Range Set base = Range("B6") の様にas Rangeで宣言して Setで代入(?)します。 baseの処は、別にrange("B6")と直打ちしても別にいいですよ。後から変更するときに面倒になるので、変数にしているだけです。 例えば base.Offset(i).Value は、 range("B6").Offset(i).Value と書いても同じです。
お礼
詳しい説明有難うございます。 もう一回トライしてみます。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
最初に最終行位置を求めて最終行から処理すればいいです。このOKWebでも結構同じ処理のサンプルがあると思います。 上から処理する場合、データに空白がないということが判っている場合(つまり空白のデータが来たら終了する場合)には、 例えば、次の様にもできると思います。 Dim base As Range Dim i Set base = Range("B6") i = 0 Do While (base.Offset(i).Value <> "") Do While (base.Offset(i).Value = 変数) Rows(base.Offset(i).Row).Delete Shift:=xlUp Loop i = i + 1 Loop
お礼
ナルホド。最終行からが定石なんですねー これをコピーして試したところ、 baseにrange("b6")のValueが入っちゃって、 offsetが上手く動かなかったです。 すみません。range形式の変数がよくわかってません。 参考になりました。有難うございました。
行の頭から行くからそうなるのです。 行削除は最終行からUPするのが通常です。 多忙のため,参考URLだけで失礼します。
お礼
最終行からなんですね。 参考になりました。 有難うございました。
お礼
わー出来ました!ありがとうございます! 成程 step -1 か・・ 助かりました。