- ベストアンサー
エクセルマクロ 複数特定文字を含む行以外の削除
- 業務で台帳の管理を効率化したいと思っています。同じ作業を繰り返すので、エクセルマクロで自動化したいと考えています。過去のログから同じようなマクロを見つけ、流用したいのですが、特定の文字を含む行以外を削除する機能が必要です。自分で試行錯誤しましたが、うまくいきませんでした。どうすれば実現できるか教えてください。
- エクセルで台帳の管理をしています。同じ作業を毎日繰り返すので、マクロを作成し自動化したいと思っています。過去のログから似たようなマクロを見つけましたが、特定の文字を含む行以外を削除する方法がわかりません。試行錯誤しましたが、解決できませんでした。どのようにすれば実現できるでしょうか。
- 台帳の管理をエクセルで行っています。毎日同じ作業をするので、マクロを使って自動化したいと考えています。過去のログから似たようなマクロを見つけましたが、特定の文字を含む行以外を削除する方法がわかりません。自分なりに試行錯誤しましたが、うまくいきませんでした。どうしたら解決できるでしょうか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
現状、このマクロを使用すると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 〇〇」の数値を変えればできますので、色々と試してみて下さい。
その他の回答 (2)
- imogasi
- ベストアンサー率27% (4737/17069)
(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をやるとして、先は長い,ように感じる。頑張るか やめるか、よく考えてみた方がよい。
お礼
使いこなすまでの道のりは遠いです。でも、便利な機能なので使えるように日々勉強していきます。ありがとうございました。
- Mathmi
- ベストアンサー率46% (54/115)
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の中の値がどう変化するのかを調べればわかりやすいと思います。
お礼
この度はありがとうございました。分かりやすい回答で勉強になります。 ウォッチウィンドウを使うってことすら知らなかったので次回から使って覚えようと思います。 また、見かけたらよろしくお願いいたします。
お礼
無事に出来ました!この度は勉強になりました。 これからも勉強していきます。