プロが教えるわが家の防犯対策術!

あるデータシートの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

A 回答 (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
    • good
    • 0
この回答へのお礼

わー出来ました!ありがとうございます!
成程 step -1 か・・
助かりました。

お礼日時:2005/04/12 19:46

>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
と書いても同じです。
    • good
    • 0
この回答へのお礼

詳しい説明有難うございます。
もう一回トライしてみます。

お礼日時:2005/04/13 10:10

最初に最終行位置を求めて最終行から処理すればいいです。

この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
    • good
    • 0
この回答へのお礼

ナルホド。最終行からが定石なんですねー
これをコピーして試したところ、
baseにrange("b6")のValueが入っちゃって、
offsetが上手く動かなかったです。
すみません。range形式の変数がよくわかってません。
参考になりました。有難うございました。

お礼日時:2005/04/12 19:51

行の頭から行くからそうなるのです。


行削除は最終行からUPするのが通常です。

多忙のため,参考URLだけで失礼します。

参考URL:http://members.ld.infoseek.co.jp/nkworks03/Excel …
    • good
    • 0
この回答へのお礼

最終行からなんですね。
参考になりました。
有難うございました。

お礼日時:2005/04/12 19:53

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!