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

このQ&Aのポイント
  • 業務で台帳の管理を効率化したいと思っています。同じ作業を繰り返すので、エクセルマクロで自動化したいと考えています。過去のログから同じようなマクロを見つけ、流用したいのですが、特定の文字を含む行以外を削除する機能が必要です。自分で試行錯誤しましたが、うまくいきませんでした。どうすれば実現できるか教えてください。
  • エクセルで台帳の管理をしています。同じ作業を毎日繰り返すので、マクロを作成し自動化したいと思っています。過去のログから似たようなマクロを見つけましたが、特定の文字を含む行以外を削除する方法がわかりません。試行錯誤しましたが、解決できませんでした。どのようにすれば実現できるでしょうか。
  • 台帳の管理をエクセルで行っています。毎日同じ作業をするので、マクロを使って自動化したいと考えています。過去のログから似たようなマクロを見つけましたが、特定の文字を含む行以外を削除する方法がわかりません。自分なりに試行錯誤しましたが、うまくいきませんでした。どうしたら解決できるでしょうか。
回答を見る
  • ベストアンサー

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

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

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

  • ベストアンサー
  • kon555
  • ベストアンサー率52% (1751/3360)
回答No.1

 現状、このマクロを使用すると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
質問者

お礼

無事に出来ました!この度は勉強になりました。 これからも勉強していきます。

その他の回答 (2)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.3

(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
質問者

お礼

使いこなすまでの道のりは遠いです。でも、便利な機能なので使えるように日々勉強していきます。ありがとうございました。

  • Mathmi
  • ベストアンサー率46% (54/115)
回答No.2

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
質問者

お礼

この度はありがとうございました。分かりやすい回答で勉強になります。 ウォッチウィンドウを使うってことすら知らなかったので次回から使って覚えようと思います。 また、見かけたらよろしくお願いいたします。

関連するQ&A

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

    M列にある特定の文字が含む行以外のものを削除するマクロを教えて下さい。 現在ネット検索で見つかったマクロを使用しています 【現在使用中のマクロ】 Sub Sample1() Dim i As Long For i = Cells(Rows.Count, "M").End(xlUp).Row To 2 Step -1 If InStr(Cells(i, "M"), "検索したい文字") = 0 Then Rows(i).Delete End If Next i End Sub これだと検索したい文字が1つしか利用できません。 「検索したい文字列1」または「検索したい文字列2」を含まない行を削除したいのですが どのようにマクロを組めばよいのでしょうか? こちらまったくの初心者です。 上記の書式にはこだわりませんので、わかる方教えて下さい。

  • エクセルのマクロについて

    Sub ア_Click() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "C").End(xlUp).Row If InStr(.Cells(i, "C"), "ア") = 0 Then If InStr(.Cells(i, "D"), "ア(半角)") = 0 and .Cells(i,"D")<>"" Then MsgBox i & "行目" Cells(i, 2).Offset(0, -1).Value = "★" End If End If Next i End With End Sub このエクセルマクロはC列に「ア」があって、D列に「ア(半角)」の文字がない場合はメッセージというマクロなのですが、このマクロをア~ンまで同じ作業をしたいのですが、ひとまとめにマクロを組む事はできるのでしょうか?できる場合どのようにすれば良いでしょうか? 下記のようにして見たのですができませんでした。 Sub ア_Click() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "C").End(xlUp).Row If InStr(.Cells(i, "C"), "[ア-ン]") = 0 Then If InStr(.Cells(i, "D"), "[ア-ン](半角)") = 0 and .Cells(i,"D")<>"" Then MsgBox i & "行目" Cells(i, 2).Offset(0, -1).Value = "★" End If End If Next i End With End Sub

  • 重複行を完全削除するエクセルのマクロ

    Sub sakujyo() Dim i, ii As Long For i = 1 To Range("a65336").End(xlUp).Row For ii = Range("a65336").End(xlUp).Row To i + 1 Step -1 If Cells(i, 4).Value = Cells(ii, 4).Value _ And Cells(i, 13).Value = Cells(ii, 13).Value Then Delete Shift:=xlUp End If Next ii Next i End Sub マクロに関しては、素人でございます。 こちらのマクロを作ってみたのですがうまくいきません。 4列目と13列目の列が重複したときのみ重複した行をすべて削除させたいと思っております。どうぞお教えください。

  • 重複行を完全削除するエクセルのマクロ

    Sub sakujyo() Dim i, ii As Long For i = 1 To Range("a65336").End(xlUp).Row For ii = Range("a65336").End(xlUp).Row To i + 1 Step -1 If Cells(i, 2).Value = Cells(ii, 2).Value _ And Cells(i, 4).Value = Cells(ii, 4).Value _ And Cells(i, 5).Value = Cells(ii, 5).Value Then Dim iii As Byte iii = 1 Rows(ii).Delete Shift:=xlUp End If Next ii If iii = 1 Then Rows(i).Delete Shift:=xlUp iii = 0 Next i End Sub データーが下の表のように入っております。     A    B    C    E    F 1  1/26  a1234  fdsa  5000  C1 2  1/27  a4567  sdfa  4000  T2 3  1/28  a1234  dfsa  5000  C1 4  1/30  b4567  asdf  6600  A2 5  2/10  b4567  fsda  6600  A2 6  2/10  a1234  afds  5000  C1 B列、E列、F列が完全一致(重複1行目と3行目と6行目・4行目と5行目)で削除し結果的に2行目だけ残る方法がしたいのですが、このマクロですと少ないデータですとうまく動くのですが、『大量のデータを一気に削除出来ない』、『同じ重複が3つ以上のデータが多数ある場合データが削除されずに残ってしまう』エラーが出てしまいます。どうかお教えください。

  • マクロで複数の行をまとめて切り取りする方法

    Iの列のセルに「テスト」があったら、その行を切り取ってシート2に貼り付ける といった流れのコードが下記です。 Sub 切り取り() Dim i, LastRow As Long LastRow = Cells(Rows.Count, 9).End(xlUp).Row For i = 1 To LastRow If Cells(i, 9) = “テスト” Then Rows(i).Cut Sheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) End If Next i End Sub ●Iの列のセルに「テスト」と「課題」があったら、その行を切り取ってシート2に貼り付ける といったものをしたいのです。 1. If Cells(i, 9) = “テスト” Then ↓ If Cells(i, 9) = “テスト,課題” Then 結果エラー 2. If Cells(i, 9) = “テスト” Then ↓ If Cells(i, 9) = “テスト&課題” Then 結果エラー 正常なコードを教えてくださいますか? 宜しくお願いします。

  • 下記のマクロはC列5行目から文字の

    下記のマクロはC列5行目から文字の入っている最後の行までの範囲で セル内に蜜柑や林檎、苺の文字が入っていたら同一行のA列にも蜜、林、苺 の文字を入れるというマクロなのですが・・・ たとえばC列12行目が 『蜜柑林檎苺』 となっていた場合、A列に入る言葉は『苺』となり『蜜』『林』という言葉が 消えてしまいます。 そこでこのマクロを少し改造して、 C列が『蜜柑林檎苺』や『蜜柑苺』となっている場合 A列に入る言葉は『蜜林苺』ないし『蜜苺』という風に積み重ねていくように改造はできないでしょうか? ↓この部分を改造すればできるようになりますか? Cells(i, 2).Offset(0, -1).Value = "蜜" Sub 蜜柑林檎苺() Dim i As Long With ActiveSheet For i = 5 To .Cells(Rows.count, "C").End(xlUp).Row If InStr(.Cells(i, "C"), "蜜柑") > 0 Then MsgBox i & "行目アウト!" Cells(i, 2).Offset(0, -1).Value = "蜜" End If If InStr(.Cells(i, "C"), "林檎") > 0 Then MsgBox i & "行目アウト!" Cells(i, 2).Offset(0, -1).Value = "林" End If If InStr(.Cells(i, "C"), "苺") > 0 Then MsgBox i & "行目アウト!" Cells(i, 2).Offset(0, -1).Value = "苺" End If Next i End With End Sub

  • エクセルマクロ 特定の文字列を含む行のみを残す (マクロ修正)

    以下のマクロは、EXCEL2003で 「特定の文字列が含まれている列を削除する」動作をするマクロです Sub Macro1() Const col As String = "A" '文字列が入力されている列 Dim idx As Long Dim keyWord keyWord = Application.InputBox("削除対象の文字列は?", Type:=2) If TypeName(keyWord) <> "Boolean" And Len(keyWord) > 0 Then   For idx = Cells(65536, col).End(xlUp).Row To 1 Step -1     If InStr(Cells(idx, col).Value, keyWord) > 0 Then '    If Application.CountIf(Rows(idx), "*" & keyWord & "*") > 0 Then       Rows(idx).Delete     End If   Next idx End If End Sub このマクロを、 「特定の文字列が含まれている行のみを残し、それ以外を削除する」 というマクロに変更したいと思っています。 是非ご回答お願いいたします。

  • 選択した行のみマクロを使いたい

    以前、こちらのサイトで表を展開するマクロを教えていただきました。 そのマクロをシート全体ではなく、任意の行や任意のセルにだけに使えるようにしたいです。 Sub 展開() Dim nLast As Long Dim vAdata, i, j Dim vData nLast = Cells(Rows.Count, 1).End(xlUp).Row '行を追加削除する時は下から上が基本 For i = nLast To 1 Step -1 vAdata = Cells(i, 1) 'A列が空白ではなく、B列が空白の場合、B列以降を上と同じにする If (vAdata <> "") And (Cells(i, 2) = "") And (i > 1) Then Rows(i) = Rows(Cells(i, 2).End(xlUp).Row).Value Cells(i, 1) = vAdata End If If vAdata = "" Then 'A列の値が空白なら削除 Rows(i).Delete Shift:=xlUp Else 'A列の最後に「,」が有る場合は取り除く If Right(vAdata, 1) = "," Then vAdata = Left(vAdata, Len(vAdata) - 1) End If vData = Split(vAdata, ",") 'A列の値がカンマで区切られていた場合 If UBound(vData) > 0 Then '対象行をコピーして区切られていた数-1だけ下に挿入 Rows(i).Copy Rows(i & ":" & i + UBound(vData) - 1).Insert Shift:=xlDown 'A列の値を区切られていた値に書き換える For j = 0 To UBound(vData) Cells(i + j, 1) = vData(j) Next j End If End If Next i End Sub というマクロを教えて頂きました。 これをどのようにすればいいでしょうか? ご教授お願いします。

  • エクセル マクロ 複数セルの色付けについて

    マクロ初心者で苦戦しており、教えていただけると大変ありがたいです。 エクセルの複数のシートに、問2_1 、問2_2 、問2_10 (全部で問は2_28まであります)等の文字列があり、その文字に合わせて、そのセルだけ色を付けたいと考えております。 今書いているコードだと、ワークシートのA列にある場合は色が付けられるのですが、それ以外に色が付けられません。どこが間違っているでしょうか? どうぞご指導お願いいたします。 Sub 色つけ() Dim Maxrow As Long Dim i As Long Maxrow = Cells(Rows.Count, i).End(xlUp).Row For i = 1 To Maxrow If InStr(Cells(i, 1), "2_1 ") > 0 Then Cells(i, 1).Interior.ColorIndex = 6 If InStr(Cells(i, 1), "2_2 ") > 0 Then Cells(i, 1).Interior.ColorIndex = 6 If InStr(Cells(i, 1), "2_23 ") > 0 Then Cells(i, 1).Interior.ColorIndex = 23 If InStr(Cells(i, 1), "2_13 ") > 0 Then Cells(i, 1).Interior.ColorIndex = 4 If InStr(Cells(i, 1), "2_6 ") > 0 Then Cells(i, 1).Interior.ColorIndex = 7 Next i End Sub

  • エクセル重複行統合マクロの意味

    Tom04さんの回答で 以下のとても素晴らしいマクロがあり、 使用させていただきたいのですが、 詳細がわかりません。 少々編集して自分の書類に反映させていただきたく、 マクロの内容を教えていただけませんか? Sub test() 'この行から Dim i, j, k, L As Long Application.ScreenUpdating = False For i = Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1 For j = 2 To Cells(1, Columns.Count).End(xlToLeft).Column + 1 For k = Cells(Rows.Count, j).End(xlUp).Row To 2 Step -1 If Cells(k, j) <> "" And WorksheetFunction.CountIf _ (Range(Cells(2, 1), Cells(k, 1)), Cells(k, 1)) > 1 Then L = WorksheetFunction.Match(Cells(k, 1), Columns(1), False) Cells(k, j).Cut Destination:=Cells(L, j) End If Next k Next j Next i For i = Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1 If WorksheetFunction.CountA(Rows(i)) = 1 Then Rows(i).ClearContents End If Next i Application.ScreenUpdating = True End Sub 'この行まで

専門家に質問してみよう