- ベストアンサー
ExcelのVBAに詳しい人に質問です
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
No.1です。 >ちなみにFor文の開始値は、最終行を返すというのは分かるんですが、終了値の「3 Setp-1」というのはどういうことなんでしょうか の件について・・・ B列の最終行から3行目まで、下の行から上に向かって1行ずつループ といった意味です。 なぜ、最終行からなのか?といえば上の行から削除してしまうと 行削除するたびに1行ずつ行が繰り上がってしまいますので、 結果的に本来削除すべき行を飛び越えてループしてしまう可能性がありますので、 行挿入・行削除の場合などは最終行から上に向かって検索するのが 「オーソドックス」といった理由です。 この程度で参考になりますかね?m(_ _)m
その他の回答 (2)
- めとろいと(@naktak)
- ベストアンサー率36% (785/2139)
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:="="
お礼
使用方法として「行を削除する」というのは絶対なので、オートフィルタでは駄目なんです。 丁寧な回答ありがとうございました。後学として参考にさせて頂きます。
- tom04
- ベストアンサー率49% (2537/5117)
こんにちは! 一例です。 オーソドックスに最終行から検索しています。 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
補足
どうも、こんにちは。 回答ありがとうございます。 VBAにそのままコピペしたら見事に思い通りの動きをしてくれました。 ちなみにFor文の開始値は、最終行を返すというのは分かるんですが、終了値の「3 Setp-1」というのはどういうことなんでしょうか。ぐぐってみたのですが、Setp-1がいまいち理解できません。
お礼
言われた通り上から下に向かっての方法を試してみたら途中で止まりました(;´Д`) なるほどです。そういう意味だったのですね。 丁寧でわかりやすい説明ありがとうございました。 とても勉強になりました。