• ベストアンサー

ExcelのVBAに詳しい人に質問です

B列に品名、C列に個数、D列に『COUNTIF関数』を使って品名が重複した場合に重複と出るようにしている表があります。※画像参照 そこで、個数(C列)が空白の行と、重複がある行を削除したいのですが、 これをVBAで簡単に処理できるようにできないでしょうか。 詳しい方アドバイスお願いします。

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

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

No.1です。 >ちなみにFor文の開始値は、最終行を返すというのは分かるんですが、終了値の「3 Setp-1」というのはどういうことなんでしょうか の件について・・・ B列の最終行から3行目まで、下の行から上に向かって1行ずつループ といった意味です。 なぜ、最終行からなのか?といえば上の行から削除してしまうと 行削除するたびに1行ずつ行が繰り上がってしまいますので、 結果的に本来削除すべき行を飛び越えてループしてしまう可能性がありますので、 行挿入・行削除の場合などは最終行から上に向かって検索するのが 「オーソドックス」といった理由です。 この程度で参考になりますかね?m(_ _)m

mzakom
質問者

お礼

言われた通り上から下に向かっての方法を試してみたら途中で止まりました(;´Д`) なるほどです。そういう意味だったのですね。 丁寧でわかりやすい説明ありがとうございました。 とても勉強になりました。

その他の回答 (2)

回答No.2

VBA使わずとも、オートフィルタで、個数列が空以外、重複列が空の行のみ 抽出すればいいと思いますが。 どうしてもVBAでしたいなら、こんな感じです。 (オートフィルタ使用です) Const HEADER_START_COLUMN As String = "B" Const HEADER_END_COLUMN As String = "D" Const TABLE_START_ROW As Integer = 2 Dim tableEndRow As Integer Dim targetRange As String tableEndRow = Range(HEADER_START_COLUMN & CStr(TABLE_START_ROW)).End(xlDown).Row targetRange = HEADER_START_COLUMN & TABLE_START_ROW & ":" & HEADER_END_COLUMN & CStr(tableEndRow) Selection.AutoFilter ActiveSheet.Range(targetRange).AutoFilter Field:=2, Criteria1:="<>", _ Operator:=xlAnd ActiveSheet.Range(targetRange).AutoFilter Field:=3, Criteria1:="="

mzakom
質問者

お礼

使用方法として「行を削除する」というのは絶対なので、オートフィルタでは駄目なんです。 丁寧な回答ありがとうございました。後学として参考にさせて頂きます。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんにちは! 一例です。 オーソドックスに最終行から検索しています。 Sub 行削除() Dim i As Long For i = Cells(Rows.Count, "B").End(xlUp).Row To 3 Step -1 If Cells(i, "C") = "" Or Cells(i, "D") = "重複" Then Rows(i).Delete End If Next i End Sub こんな感じではどうでしょうか?m(_ _)m

mzakom
質問者

補足

どうも、こんにちは。 回答ありがとうございます。 VBAにそのままコピペしたら見事に思い通りの動きをしてくれました。 ちなみにFor文の開始値は、最終行を返すというのは分かるんですが、終了値の「3 Setp-1」というのはどういうことなんでしょうか。ぐぐってみたのですが、Setp-1がいまいち理解できません。

関連するQ&A