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

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

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

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数118
  • ありがとう数6

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

  • ベストアンサー
  • 回答No.1
  • kon555
  • ベストアンサー率53% (599/1118)

 現状、このマクロを使用すると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 〇〇」の数値を変えればできますので、色々と試してみて下さい。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連する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

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

    以下のマクロは、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 このマクロを、 「特定の文字列が含まれている行のみを残し、それ以外を削除する」 というマクロに変更したいと思っています。 是非ご回答お願いいたします。

その他の回答 (2)

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

(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をやるとして、先は長い,ように感じる。頑張るか やめるか、よく考えてみた方がよい。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

  • 回答No.2
  • Mathmi
  • ベストアンサー率47% (53/111)

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の中の値がどう変化するのかを調べればわかりやすいと思います。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

  • エクセル マクロで行削除のコードについての質問です

    ある指定のセル範囲が空白ならその行自体を削除したいですが 上手くいきません。 記述したコードは以下の通りです。 Sub A01() Dim IRow As Long Dim d As Variant, i As Variant d = InputBox("抽出する日数を入力してください", "日数") If d = "" Then Exit Sub lRow = Cells(Rows.Count, 1).End(xlUp).Row For i = lRow To 2 Step -1 If ActiveSheet.Range(Cells(i, 5), Cells(i, d)) = Empty Then ActiveSheet.Rows(i).EntireRow.Delete End If Next End Sub Ifの判定の部分でエラーが出ます。 どう修正したらよいかご教示願います。

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

    マクロ初心者で苦戦しており、教えていただけると大変ありがたいです。 エクセルの複数のシートに、問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

  • エクセルで表を展開するマクロを作りたい

    こんにちは。 エクセルで表を展開したいのですがマクロが作れません。 どなたか詳しい方教えて下さい。     A   B   C  D 1  1,2,3  abc  def  ghi を    A   B   C  D 1  1 abc  def  ghi 2   2  abc  def  ghi 3  3  abc  def  ghi というように展開したいです。 10列目くらいまで対応したマクロが作りたいです。 Sub test() 'この行から Dim i, j, k As Long Dim myArray As Variant For i = Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1 If Not Cells(i, 1) Like "*" & "," & "*" Then i = i - 1 myArray = Split(Cells(i, 1), ",") k = UBound(myArray) Rows(i + 1 & ":" & i + k).Insert For j = 0 To k Cells(i + j, 1) = myArray(j) Next j Next i For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, 2) = "" Then Cells(i, 2) = Cells(i - 1, 2) End If Next i Columns("A:B").AutoFit End Sub 'この行まで これにどう付け足せばいいでしょうか? どうかご教授お願い致します。

  • エクセル 同じ内容行削除マクロ 2

    シート1、シート2(基準)のB列を比較して同じ内容行を削除したいのですが、「栃木県3」と「#栃木県3」を同じのもと考えて削除されてしまいます。 Sub 削除()   Dim wh1     As Worksheet   Dim wh2     As Worksheet   Dim f      As Range   Dim wR     As Integer   Dim mR     As Long   Dim wStr    As String   '   Set wh1 = Worksheets("Sheet1")   Set wh2 = Worksheets("Sheet2")   wR = 0   With wh1     mR = .Cells(Rows.Count, "A").End(xlUp).Row     For wR = mR To 1 Step -1       wStr = .Cells(wR, "B")       Set f = wh2.Range("B1:B" & wh2.Cells(Rows.Count, "B").End(xlUp).Row).Find(wStr)       If Not f Is Nothing Then         .Rows(wR).Delete       End If     Next   End With End Sub 解決策教えて下さい。

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

    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 結果エラー 正常なコードを教えてくださいますか? 宜しくお願いします。

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

    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列目の列が重複したときのみ重複した行をすべて削除させたいと思っております。どうぞお教えください。

  • エクセル VBA 特定文字がある行を別シートに移動

    ソフト excel2003 o列に文字列が入力された表があります。 マクロ実行時下記のようにするには、VBAのコードをどのように記入すればよろしいでしょうか? 赤枠で囲んだボタンをクリックすると シート1のO列に 中 が入力されている行を切り取りし中シートに貼り付け (下の行は上方向にシフト) ※ シート1の内容は日毎に更新されますので、更新後、赤枠で囲んだボタンをクリックするとその時点で 中 が入力されているものは中シートのリストへ追加されるようにしたいのです。 以前ここで教えていただいたものを参考に作成してみたの(以下に記載)ですがうまくいきません。 お助けいただけないでしょうか。 宜しくお願い致します。 Sub ボタン中シート_Click() 'Sheet2の挿入位置(C列は結合セルではなく、必ず何か入っている事) nMax2 = Sheets("中シート").Cells(Rows.Count, 3).End(xlUp).Row + 1 With Sheets("sheet1") nMax1 = .Cells(Rows.Count, 9).End(xlUp).Row For i = nMax1 To 2 Step -2 If .Cells(o, 15) = "中" Then .Range(.Cells(o, 1), .Cells(o + 1, 10)).Copy Sheets("中シート").Cells(nMax2, 1).Insert Shift:=xlDown .Range(.Cells(o, 1), .Cells(o + 1, 10)).Delete Shift:=xlUp End If Next i End With End Sub

  • エクセルVBA 特定文字以外の行削除

    こんにちは。 先日以下のURLで質問させて頂きました者です。 http://okwave.jp/qa/q8567085.html そこで、教えて頂いたマクロは成功したのですが、 inputboxではない方法を知りたいです。 ---前回頂きました回答を引用しております------------------------------ retu = "D" word = InputBox(retu & "列に指定した文字が含まれていない行を削除します。" _ & vbCrLf & "検索する文字を入力してください。") For i = Range("D" & "65536").End(xlUp).Row To 2 Step -1 If InStr(1, Range(retu & i).Value, word) = 0 Then Rows(i).Delete End If Next i ------------------------------------------------------------------ この文の文字を入力せずに、 マクロの中に特定の文字を記入して、その文字列以外の行を削除したいです。 ご教授頂けたらと思います。 宜しくお願い致します。

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

    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 'この行まで

  • excelマクロの重複セルの削除について

    excelマクロ超初心者です。 E列に下記のようにデータが入っていたとします。   E列 1 いちご 2 りんご 3 みかん 4 いちご 5 りんご 6 れもん これを重複セルを削除して   E列 1 いちご 2 りんご 3 みかん 4 れもん としたいのですが、どうすればいいでしょうか? 自分なりに調べて、下記のように記述したのですが、 Sub test() lastRow = wb.Sheets("Sheet1").Range("E" & Rows.Count).End(xlUp).Row 'E列最終行 For i = lastRow To 2 Step -1 If Cells(i, 5).Value = Cells(i - 1, 5).Value Then Cells(i, 5).EntireRow.Delete Shift:=xlUp End If Next i End Sub() E4列から下のデータしか重複セルが削除されません。 ここでいうlastRow To 2 Step -1はどういう意味なのでしょうか? すみませんが宜しくお願いします。