• ベストアンサー

条件によって行削除を繰り返し処理する

一行目がフィールド名で、Z列まで値の入っているデータがあります。 x列が""の場合はその行を削除する処理を最終行まで続けたいのですが、 ""行が2行以上続いているとFor~によって行を飛ばしてしまいます。 何か良い方法はありませんでしょうか? Sub 削除() Dim last As Long Dim row As Long last = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).row For row = 2 To last If Cells(row, 24).Value <> "" Then Rows(Format(row) + ":" + Format(row)).EntireRow.Deletesift:=xlUp End If Next End Sub

質問者が選んだベストアンサー

  • ベストアンサー
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.5

X列が空白の行を消すだけならこれでよいのでは? ただしrow→idxにしました(rowというプロパティがあるからです) For~Nextを上から流すと行削除した時点で行番号が変わるので、下からにするのが一般的だと思います Sub 削除() Dim last As Long Dim idx As Long  last = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).row  For idx = last To 2 Step -1   If Cells(idx, 24).Value = "" Then    Rows(idx).Delete   End If  Next End Sub

soukpn
質問者

お礼

記述していただいたコードにて無事解決する事が出来ました。 列削除にて右からやらなければ正常に作動しない事を知っていたにも関わらず、 気づく事が出来ませんでした。 とても助かりました、ありがとうございます。

すると、全ての回答が全文表示されます。

その他の回答 (5)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.6

こんにちは。 row は、予約語ではありませんが、それはプロパティとして使われる単語ですから、それを変数にしたら、読みにくいと思います。一応、VBAにはVBAの世界がありますので、変数も大事にしてください。 それから、名前付き引数は、  EntireRow.Deletesift:=xlUp ではなくて、Delete Shift:=xlUp だと思いますね。 コードとしては、単にこういうことでは?    Sub 削除2()   Dim r As Range   Dim LastRow As Long   On Error GoTo EndLine   LastRow = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row   Set r = Range("X2").Resize(LastRow - 1).Cells.SpecialCells(xlCellTypeBlanks)   r.EntireRow.Delete EndLine: End Sub ただし、 LastRow = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row は、一体、どこを指しているのかは、不明です。X列で、空白値を取るのに、X列でない部分で、取るということは、X列と同等の行になるということを意味します。

soukpn
質問者

お礼

もう少しプロパティなどについても勉強しなければと思いました。 元の構文も、拝借してきた物なので、全てを理解しているるわけではなく、 もっと勉強しなければと思います。 ありがとうございました。

すると、全ての回答が全文表示されます。
  • Kame_LABO
  • ベストアンサー率24% (30/122)
回答No.4

#1です。 > Rows(Format(row) + ":" + Format (row)).EntireRow.Deletesift:=xlUp > End If > Next END IFの後でなく、前に入れてください。

soukpn
質問者

お礼

END IF の前にいれてやったところ、永久ループになってしまったのです。

すると、全ての回答が全文表示されます。
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.3

ANo.2です。 >""行が2行以上続いているとFor~によって行を飛ばしてしまいます。 見落としてました。 すいません。

soukpn
質問者

お礼

for~だと必ず row の桁が上がってしまうからだめなんだと気づきだしました。 普通に IF~ で条件をつけ、x列が""ではなくなったら、row+1にするのがいいのでしょうか? そうした場合lastの値をどのように活用したらよいのかが判りません。

すると、全ての回答が全文表示されます。
  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.2

>For row = 2 To last For row = last To 2 Step -1 と逆順で行なっては?

すると、全ての回答が全文表示されます。
  • Kame_LABO
  • ベストアンサー率24% (30/122)
回答No.1

> Rows(Format(row) + ":" + Format(row)).EntireRow.Deletesift:=xlUp を実行後rowをマイナス1してください。

soukpn
質問者

お礼

誤 ⇒ If Cells(row, 24).Value <> "" Then 正 ⇒ If Cells(row, 24).Value = "" Then でした。 Rows(Format(row) + ":" + Format(row)).EntireRow.Deletesift:=xlUp の後に row = row -1 をいれてみましたが、なぜか永久ループしてしまいます。

soukpn
質問者

補足

誤 ⇒ If Cells(row, 24).Value <> "" Then 正 ⇒ If Cells(row, 24).Value = "" Then でした。 Rows(Format(row) + ":" + Format(row)).EntireRow.Deletesift:=xlUp の後に row = row -1 をいれてみましたが、なぜか永久ループしてしまいます。

すると、全ての回答が全文表示されます。

関連するQ&A

専門家に質問してみよう