• ベストアンサー
  • すぐに回答を!

エクセルマクロ 複数特定文字を含む行以外の削除

  • 質問No.9732460
  • 閲覧数109
  • ありがとう数6
  • 回答数3

お礼率 100% (3/3)

業務で台帳の管理をやることになり。毎日同じような作業だったので
マクロで出来るようにしたいと思いネットを漁っていた所、過去ログから
丁度同じ感じのものを発見し、流用したいのですが、このまま使用すると
固定したい行まで削除されてしまいます。勉強がてらどうにか自分で出来ないかと
色々試行錯誤したのですが、わからなかったので教えて下さい。

Sub Sample1()
Dim i As Long
For i = Cells(Rows.Count, "S").End(xlUp).Row To 2 Step -1
If InStr(Cells(i, "S"), "ABC1002") = 0 Then
Rows(i).Delete
End If
Next i
End Sub

A16行まではウインドウ枠の固定で使用しています。
なのでA16行以降でこのマクロを実行したいです。
ご指導よろしくお願いいたします。

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

  • 回答No.1
  • ベストアンサー

ベストアンサー率 52% (563/1066)

他カテゴリのカテゴリマスター
 現状、このマクロを使用すると2行目まで対象になっていますよね?
 その範囲を指定しているのが以下の部分の『To 2』です
「For i = Cells(Rows.Count, "S").End(xlUp).Row To 2」

 なので、16行までを固定で使用しているなら、対象を17行までにすればよいので、以下のように修正すればいいです
「For i = Cells(Rows.Count, "S").End(xlUp).Row To 17」

 もしまた対象範囲を替えたくなった場合は、この「To 〇〇」の数値を変えればできますので、色々と試してみて下さい。
お礼コメント
iwanoa

お礼率 100% (3/3)

無事に出来ました!この度は勉強になりました。
これからも勉強していきます。
投稿日時:2020/04/09 10:39

その他の回答 (全2件)

  • 回答No.3

ベストアンサー率 27% (4544/16262)

(1)For
  Next
で範囲内行のセルを悉皆的に調べて、Ifの行でセルの値や・状態を判断して、該当の行を削除するわけです。
(2)その行の全列削除するなら、Rows(i).Deleteより
https://www.relief.jp/docs/excel-vba-difference-entirerow-row.html
EntireRowとRowの違い
Cells(i, 1).EntireRow.Delete などがよかろう。
(3)普通のFor Nextの用途例では、1=は小さい(上の方)行から、大きい行に1つずつ処理する例が多いですが、行削除の場合は下から上に向かって処理をする場合が多い。なぜかわかりますか。ここが経験から来るポイントです。
>固定したい行まで削除されてしまいます
の問題は、
行的に、i=1、からが対象になってしまうからです。1-16行目も対象になってしまう。17行からを対象にしたければ、下から上に上がってくる処理を、i=17で止めれなよい。
For i = Cells(Rows.Count, "S").End(xlUp).Row To 2 Step -¹の2を17にすればよい。
質問文の、>A16行まで、>A16行以降の表現において、「含む・含まない」の点で、表現に厳密さがないのでは?よく考えて正しい方に決めてください。
==
この質問が出るのでは、VBAをやるとして、先は長い,ように感じる。頑張るか
やめるか、よく考えてみた方がよい。
お礼コメント
iwanoa

お礼率 100% (3/3)

使いこなすまでの道のりは遠いです。でも、便利な機能なので使えるように日々勉強していきます。ありがとうございました。
投稿日時:2020/04/09 10:34
  • 回答No.2

ベストアンサー率 47% (51/108)

CellsやRangeによるセルの指定、Rowsによる行の指定は分かりますね?

>A16行まではウインドウ枠の固定で使用しています。
>なのでA16行以降でこのマクロを実行したいです。
サンプルコードから
・A17からA列の最終行までを検索、特定の文字列がなければ、その行を削除する。
をしたいのだと判断しました。

今回の場合、A列の最終行から17行目までを降順にチェックしていきます。
(17行目から昇順にチェックしようとすると、行の削除で行番号がずれて、想定とは違う動きをする)
最終行の行番号を調べる方法はいくつかあるのですが、今回はサンプルコードと同様に
>Cells(Rows.Count, "A").End(xlUp).Row
とします(列指定がSからAに変更しています)。
意味は「A列の一番下のセルから、End+上キーで移動したセルの行番号」です。

そこから17列目まで降順でループさせたいので、コードとしては
>For i = Cells(Rows.Count, "A").End(xlUp).Row To 17 Step -1
になります。

STEPは、ループカウンタ(今回はi)の値の変動を指定します。今回は-1を指定していますので、値を-1ずつしていきます。

参考:https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/fornext-statement

for-nextの挙動を知りたければ、「右クリック->ウォッチ式の追加」で、ウォッチウィンドウにiを追加した状態で、F8でステップ実行し、iの中の値がどう変化するのかを調べればわかりやすいと思います。
お礼コメント
iwanoa

お礼率 100% (3/3)

この度はありがとうございました。分かりやすい回答で勉強になります。
ウォッチウィンドウを使うってことすら知らなかったので次回から使って覚えようと思います。
また、見かけたらよろしくお願いいたします。
投稿日時:2020/04/09 10:36
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ページ先頭へ