• ベストアンサー

ExcelVBA:複数の文字列を検索し、行ごと削除したい

VBA初心者です。お教え下さい。 タイトル通り複数の文字列(例えば「aaa」)を検索し、行ごと削除したいのですが、以下のコードでは、「aaa」を検索せず、一番上の行から削除されてしまいます。。。 どこがどう間違ってるかわかりません。 どうかよろしくお願いします。 Private Sub CommandButton1_Click() Dim StrkeyWord(10) As String '検索した文字列 Dim IngStartRow As Long '検索結果の行 Dim FoundCell As Range Dim SearchArea As Range Set SearchArea = ActiveSheet.UsedRange '検索対象範囲 Set FoundCell = SearchAea.Find(what:=trkeyWord) '検索実行 If FoundCell Is Nothing Then Exit Sub '検索文字列が含まれるセルがない場合中断 StrkeyWord(1) = "aaa" StrkeyWord(2) = "bbb" StrkeyWord(3) = "ccc" StrkeyWord(4) = "ddd" StrkeyWord(5) = "eee" StrkeyWord(6) = "fff" StrkeyWord(7) = "ggg" StrkeyWord(8) = "hhh" StrkeyWord(9) = "iii" StrkeyWord(10) = "jjj" For i = 1 To 10 Cells.Find(what:=StrkeyWord).Activate '検索 IngStarRow = ActiveCell.Row '検索結果の行からの削除の場合 Rows((Str(IngStartRow)&":"&Cstr(IngStartRow)),Delete Shift :=xlUp '削除 End Sub

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんばんは。 この全体のコードの設計の発想は、初心者の方には無理です。ミスしそうな部分が一杯ありすぎます。アイデア自体は否定しませんが、初心者の方には、難しすぎます。 Private Sub CommandButton1_Click()   Dim StrkeyWord(10) As String   Dim FoundCell As Range   Dim FirstCell As String   Dim SearchArea As Range   Dim UArea As Range 'Union でまとめていく   Dim i As Long   Dim j As Long      Set SearchArea = ActiveSheet.UsedRange '検索対象範囲      StrkeyWord(1) = "aaa"   StrkeyWord(2) = "bbb"   StrkeyWord(3) = "ccc"   StrkeyWord(4) = "ddd"   StrkeyWord(5) = "eee"   StrkeyWord(6) = "fff"   StrkeyWord(7) = "ggg"   StrkeyWord(8) = "hhh"   StrkeyWord(9) = "iii"   StrkeyWord(10) = "jjj"      Application.ScreenUpdating = False   With SearchArea     For i = 1 To 10       Set FoundCell = .Find( _       What:=StrkeyWord(i), _       LookIn:=xlValues, _       LookAt:=xlWhole, _       SearchDirection:=xlNext)              If Not FoundCell Is Nothing Then         Set UArea = FoundCell         FirstCell = FoundCell.Address         Do           Set FoundCell = .FindNext(FoundCell)           If FirstCell = FoundCell.Address Then Exit Do           Set UArea = Union(UArea, FoundCell)         Loop Until FoundCell Is Nothing       End If       If Not UArea Is Nothing Then         For j = UArea.Areas.Count To 1 Step -1           UArea.Areas(j).EntireRow.Delete         Next       End If       Set UArea = Nothing       FirstCell = ""     Next i   End With   Application.ScreenUpdating = True   Set SearchArea = Nothing End Sub

goo397620
質問者

お礼

お礼が遅くなり申し訳ありません。 思い通りの動きが確認できました! ありがとうございます! 初心者には、難しい・・・。 コードを見て実感しました。 もっと勉強していきたいと思います!

すると、全ての回答が全文表示されます。

その他の回答 (1)

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.2

こんなアルゴリズムはどうでしょうか。 どうせ消す行ですから、まず検索文字がある行のA列に削除サインを書き込みます。その後で削除サインが立っている行だけ削除します。 Private Sub CommandButton1_Click() Dim StrkeyWord(10) As String '検索した文字列 Dim FoundCell As Range Dim FirstAdrs As String Dim SearchArea As Range Dim i As Integer  Set SearchArea = ActiveSheet.UsedRange '検索対象範囲  StrkeyWord(1) = "aaa"  StrkeyWord(2) = "bbb"  StrkeyWord(3) = "ccc"  StrkeyWord(4) = "ddd"  StrkeyWord(5) = "eee"  StrkeyWord(6) = "fff"  StrkeyWord(7) = "ggg"  StrkeyWord(8) = "hhh"  StrkeyWord(9) = "iii"  StrkeyWord(10) = "jjj"  For i = 1 To 10   Set FoundCell = SearchArea.Find(StrkeyWord(i), LookIn:=xlValues)   FirstAdrs = ""   If Not FoundCell Is Nothing Then    FirstAdrs = FoundCell.Address    Do     Cells(FoundCell.Row, 1).Value = "DEL"     Set FoundCell = SearchArea.FindNext(FoundCell)    Loop Until FoundCell.Address = FirstAdrs   End If  Next i  For i = Range("A65536").End(xlUp).Row To 1 Step -1   If Cells(i, 1) = "DEL" Then    Rows(i).Delete   End If  Next i End Sub

goo397620
質問者

お礼

お礼が遅くなり申し訳ありません! こうゆう考え方もあるのだ、と感心しました。 思いつきもしませんでした。。。 もっと勉強していきたいと思います! ありがとうございました!!!

すると、全ての回答が全文表示されます。

関連するQ&A

  • VBA 特定もセルに入力で実行

    下記のコードを実行した際は問題なく実行されるのですが これを特定のセルに値が入力された際に動かそうとするとエラーになってしまいます。 Sub PaintTargetCharacter() Dim FoundCell As Range, FoundCell2 As Range Dim Addr As String Dim Addr2 As String Dim SearchArea As Range Dim SearchArea2 As Range Application.ScreenUpdating = False ActiveCell.Interior.ColorIndex = 0 '検索対象範囲 Set SearchArea = Worksheets("G番情報").Range("AE6:BG6") '検索実行 Set FoundCell = SearchArea.Find(What:=ActiveCell.Offset(0, -1), LookIn:=xlValues, _ LookAt:=xlPart, MatchCase:=False, MatchByte:=False) '検索文字列を含むセルがない場合は終了 If FoundCell Is Nothing Then Exit Sub Set SearchArea2 = Range(FoundCell.Offset(1, 0), FoundCell.Offset(33, 0)) Set FoundCell2 = SearchArea2.Find(What:=ActiveCell, LookIn:=xlValues, _ LookAt:=xlPart, MatchCase:=False, MatchByte:=False) If FoundCell2 Is Nothing Then Exit Sub FoundCell2.Copy Destination:=ActiveCell Application.ScreenUpdating = True End Sub 当然、特定のセルで値を入力後エンターキーを押すとアクティブセルは下に下がってしまうので Private Sub Worksheet_Change(ByVal Target As Excel.Range) Target.select Call PaintTargetCharacter End Sub としているのですが Set FoundCell = SearchArea.Find(What:=ActiveCell.Offset(0, -1), LookIn:=xlValues, _ LookAt:=xlPart, MatchCase:=False, MatchByte:=False) の部分でエラーが起きてしまいます。 また停止してシートに戻るとセルのカーソル表示が消えてしまいます。 この現象はシートを閉じて再度開くと直りますが なにかエラーと関係しているのでしょうか? 初心者なのでおかしな部分が多々あると思います。 ご指摘などあれば宜しくお願いします。

  • 特定文字列を含む行を削除するマクロ

    すみませんどなたか教えてください。 エクセルで商品の在庫管理をしておりまして、AP列に製品メーカー名が入っているのですが、 いくつかの(数十個)メーカーを省き削除したく思い、以下のようなマクロをググって作ってみましたが、 上手く動きませんでした。 1つのメーカーだけ記載した場合はうまく動きました。 やりたいことは1つのマクロの中に、数十個のメーカー名を記入しておき、そのメーカーを全件 検索して、AP列に文字列が含まれる場合は、その行を削除したいです。 宜しくお願い致します。 ~~~~~~ Sub DelLines1() Dim R As Range Do Set R = ActiveSheet.Range("AP:AP").Find(What:="softbank", LookAt:=xlPart) If R Is Nothing Then Exit Sub R.EntireRow.Delete Loop Sub DelLines2() Dim R As Range Do Set R = ActiveSheet.Range("AP:AP").Find(What:="docomo", LookAt:=xlPart) If R Is Nothing Then Exit Sub R.EntireRow.Delete Loop Sub DelLines3() Dim R As Range Do Set R = ActiveSheet.Range("AP:AP").Find(What:="au", LookAt:=xlPart) If R Is Nothing Then Exit Sub R.EntireRow.Delete Loop End Sub

  • 「実行時424 オブジェクトが必要です」が出ます

    全く理解できていない初心者です。 あるサイトで見つけたマクロです。 「検索結果のセルをすべて選択する」 Sub SelectTargets() Dim Target As String Dim FoundCell As Range, SearchArea As Range Dim Addr As String Dim FoundAddr() As String Dim i As Long Target = Application.InputBox("検索文字列入力", "検索", Type:=2) If Target = "False" Then Exit Sub Set SearchArea = ActiveSheet.UsedRange * Set FoundCell = SearchArea.Find(what:=Target, LookIn:=xlValues, _ LookAt:=xlPart, MatchCase:=False, MatchByte:=False) If FoundCell Is Nothing Then Exit Sub Addr = FoundCell.Address Do ReDim Preserve FoundAddr(i) '配列の内容を維持したまま再宣言 FoundAddr(i) = FoundCell.Address '検索結果のアドレスを配列に格納 Set FoundCell = SearchArea.FindNext(After:=FoundCell) i = i + 1 If FoundCell Is Nothing Then Exit Do Loop Until FoundCell.Address = Addr '配列に格納されたアドレスをカンマ区切りで結合し、セル範囲を一括選択 Range(Join(FoundAddr, ",")).Select '---(1) End Sub ↑家のエクセル(2010)では完璧でできるのですが、会社のエクセル(2003)では、「実行時424 オブジェクトが必要です」とエラーメッセージが出ます。 コードの入力ミスがありました。 上から2行目  Dim foundcell As Range, sercharea( 正 seacharea)As Range 後は、入力ミスはなさそうなのですが、実行キーを押すと 「実行時424 オブジェクトが必要で」と出ます。 黄色のマーカーが出るのが、*印を置いた ↓に出ます。 Set FoundCell = SearchArea.Find(what:=Target, LookIn:=xlValues, _ LookAt:=xlPart, MatchCase:=False, MatchByte:=False) 後、気になるのがコードを入力して 「target」「searcharea」「foundcell」「foundaddr」「addr」などが頭文字が大文字になりません。 無理やり大文字にしてみたりしましたが… 「オブジェクトが必要です」に関係あるのかないのかも分かりませんが、なぜ、エラーが出てしまうのか? 入力ミスが原因なのか? 何が足りないのか?何か不要なコードがあるのか? どの用意すればいいのか教えていただけませんか? よろしくお願いします。

  • VBA 特定の文字列を含む行を削除する方法

    特定の文字列を含む行を削除する方法が知りたいです。 行を削除する方法はWebで見つけたのですが↓ ---------------------------------------------------- Sub 特定の文字列を含む行を削除() Dim c As Range Dim myRow As Long With Range("A:A") Set c = .Find("特定の文字列") Do While Not c Is Nothing Rows(c.Row).Delete shift:=xlUp Set c = .Find("特定の文字列") Loop End With End Sub ---------------------------------------------------- ↑行を指定している箇所のRowsを Columns  RowをColomn に変更して以下の様にしてみました、   Columns(Colomn,c).Delete shift:=xlUp だめでした、、、。 VBAの知識が乏しく、組み立て方について理解が無いため、どうすればよいかさっぱりわからず、、 こちらで質問させて頂きました。。。 何卒宜しくお願い致します。

  • 行の削除

    列Kに、削除という文字が入っている場合は、その行を削除するということで、3000行くらいあるなかで3分の2程度は削除する行に該当します。 下のマクロで試してみましたが、このマクロではとっても時間がかかってしまうんですが、どうしたら早く処理できるのか教えて下さい。 Dim R As Range Do Set R = ActiveSheet.Range("K:K").Find(What:="削除", LookAt:=xlWhole) If R Is Nothing Then Exit Sub R.EntireRow.Delete Loop

  • Union メソッド ?

    いつもこちらでお世話になっております。 全くのど素人で申し訳ありません。 会社でエクセル2003を使用しています。 データを一括検索したく、あるサイトでこのマクロを見つけました。 「検索結果のセルをすべて選択する」 Sub SelectTargets() Dim Target As String Dim FoundCell As Range, SearchArea As Range Dim Addr As String Dim FoundAddr() As String Dim i As Long Target = Application.InputBox("検索文字列入力", "検索", Type:=2) If Target = "False" Then Exit Sub Set SearchArea = ActiveSheet.UsedRange Set FoundCell = SearchArea.Find(what:=Target, LookIn:=xlValues, _ LookAt:=xlPart, MatchCase:=False, MatchByte:=False) If FoundCell Is Nothing Then Exit Sub Addr = FoundCell.Address Do ReDim Preserve FoundAddr(i) '配列の内容を維持したまま再宣言 FoundAddr(i) = FoundCell.Address '検索結果のアドレスを配列に格納 Set FoundCell = SearchArea.FindNext(After:=FoundCell) i = i + 1 If FoundCell Is Nothing Then Exit Do Loop Until FoundCell.Address = Addr '配列に格納されたアドレスをカンマ区切りで結合し、セル範囲を一括選択 Range(Join(FoundAddr, ",")).Select '---(1) End Sub 補足として Rangeプロパティの引数に指定する文字列には文字数制限があるため、検索対象のセルが多いと(1)でエラーが発生します。その場合はUnionメソッドを使用して対象セルを選択すると良いでしょう。 と、補記があり調べてみると「変数Targetの文字数が255を超えたとき」エラーとなるとのこと。 「Union メソッド」をいろいろ調べて試してみたのですが… やはり、さっぱり全くできません。 ご教授いただけませんでしょうか?

  • Find関数内にFind関数をかける場合

    エラー91が発生し、手詰まりです。 どなたかご教授お願いいたします。 Find関数でDo~lppoを行い、初期の検索結果アドレスでLoopを抜けようと思ったのですが。。 エラーしてしまいました。 Find関数内にFind関数を用いることが出来ない と目にしたのですが。 下記のようなVBAの場合 どのように対処したらいいでしょうか? また、VBA初心者のため VBA文が見づらかったり、おかしなところがあると思います。 その部分についても教えて頂けたらと思います。 Sub SAMPLE() Dim TargetDE As String '文字列型 Dim TargetNo As String '文字列型 Dim PODate As String '文字列型 Dim FoundCell As Range ' Dim FoundDate As Range Dim FoundCellNo As Long '長整数型 Dim FoundDateNo As String Dim SearchArea As Object 'オブジェクト型 Dim tar_obj(1) As Object 'オブジェクト型 Dim Addr As String '文字列型 Dim Lastrom As Long ' Dim POLEFT As Range '検索文字列入力(DE) TargetDE = Application.InputBox("Fill in a DE:??", "DE:??", Type:=2) If TargetDE = "False" Then Exit Sub '検索対象範囲 Set SearchArea = Workbooks("Sample sample.xlsx").Sheets("Sample") Set tar_obj(1) = Workbooks("INPUT FORMAT.csv").Sheets("INPUT FORMAT") '表示先をクリア tar_obj(1).Cells(1, 1).CurrentRegion.ClearContents '検索実行 Set FoundCell = SearchArea.Range("C:C").Find(What:=TargetDE, LookIn:=xlValues, _ LookAt:=xlPart, MatchCase:=False, MatchByte:=False) '検索文字列(DE)を含むセルがない場合は終了 If FoundCell Is Nothing Then Exit Sub '検索文字列入力(DE Number) TargetNo = Application.InputBox("Fill in DE nomber", "Nomber", Type:=2) If TargetNo = "False" Then Exit Sub '最初の検索結果の行数を格納 Addr = FoundCell.Address '検索文字列入力(PO Date) PODate = Application.InputBox("Fill in Sample Date", "Date", Type:=2) If PODate = "False" Then Exit Sub Do '検索Cell右横の値がTargetNoと同じ場合 If FoundCell.Offset(0, 1).Value = TargetNo Then '行番号を代入 FoundCellNo = FoundCell.Row '検索の下限値を変数に代入 F_LAST = FoundCellNo + 50 '検索実行 Set FoundDate = SearchArea.Range(SearchArea.Cells(FoundCellNo, 1), SearchArea.Cells(F_LAST, 1)).Find(What:=PODate, LookIn:=xlValues, _ LookAt:=xlPart, MatchCase:=False, MatchByte:=False) '検索文字列を含むセルがない場合は終了 If FoundDate Is Nothing Then 'MsgBox "Find is mistake" '検索文字列を含むセルがある場合 Else '変数に行番号代入 FoundDateNo = FoundDate.Row If FoundDate.Offset(1, 1).Value = "" Then MsgBox "The position of the cell is not correct. Please coordinate macro. " Else POLEFT = FoundDate.Offset(1, 1) For i = 2 To 13 If FoundDate.Offset(1, i) <> 0 Then If FoundDate.Offset(1, i) <> "." Then If IsNumeric(FoundDate.Offset(1, i).Value) = True Then '表示先(INPUT FORMAT)の行数をカウントアップ cnt = cnt + 1 PORIGHT = FoundDate.Offset(1, i).Value tar_obj(1).Range("E" & cnt) = POLEFT & PORIGHT End If End If End If Next i End If End If ElseIf FoundCell.Offset(0, 1) <> TargetNo Then ' MsgBox "Find is mistake" End If '次の検索を実行 Set FoundCell = SearchArea.Range("C:C").FindNext(After:=FoundCell) Loop While Not FoundCell Is Nothing And FoundCell.Address <> Addr ' If FoundCell.Offset(0, 1) <> TargetNo Then ' MsgBox "Not Find Number" ' End If End Sub

  • Excel2000マクロ_検索値以外の行削除をしたい。

    全てのシートに対して、B2からB列の最終行までの値が 50の倍数(MAX600迄で0を含む)以外の行を削除したいのですが 下記のマクロだと逆に残したい行を消してしまいます。 この場合は、どの様なコードを書いた方が良いのでしょうか? 宜しくお願いします。 Sub 行削除() Dim trow As Range   Do     Set trow = Range("B").Find(What:=50, LookIn:=xlValues)     If trow Is Nothing Then Exit Sub     Rows(trow.Row).Delete   Loop End Sub

  • ExcelVBAで行と列の検索

       A  B  C  D  E 1  コード あ  い  う  え 2  10  ○    ○ 3  20     ○  ○ 4  30          ○ 上記の表が5000件あります。Textbox1に入力し検索ボタンを押すと A列のコードを検索して一致する列の○のあるところの1行目の項目 をtextbox2に表示したいのですがうまく行きません。 よろしくお願い致します。 Private Sub CommandButton1_Click() '検索フォームボタン Dim i As Long Dim 最終行 As String Dim サーチ行 As Long Sheets(1).Activate 最終行 = Range("A1").End(xlDown).Row サーチ行 = 0 For i = 2 To 最終行 If TextBox1.Value = Range("A" & i) Then If Range("B" & i, "N" & i) = "" Then TextBox2.Text = Range("B1", "N1") サーチ行 = i Exit For End If End If Next If サーチ行 = 0 Then MsgBox TextBox1.Value & "データはありません。", vbInformation, "無し" End If TextBox1.SetFocus End Sub エラーはでません。データはありませんとなります。  

  • FINDで複数ヒットする場合

    EXCELで 範囲(A1:J2)で「東京」が存在する最初の列番号は以下で求められますが 範囲内には、他にも「東京」が複数ヒットします。 その場合は、どのようなコードになりますか ? 作業手順として考えたのは 最初に見つけた「東京」の次の列からを検索範囲に変更して次の「東京」をFIND 同じように検索範囲を次々と変更して最終的に「東京」が見つからなかったらFINDを終了すれば良さそうですが? 又、 他に良いコードがあれば教えてください。 Sub FindColumns() Dim searchString As String Dim searchRange As Range Dim foundCell As Range Dim columnNumbers As String ' 検索する文字列を指定 searchString = "東京" ' 検索範囲を指定 Set searchRange = Range("A1:J2") ' 検索を実行 Set foundCell = searchRange.Find(What:=searchString, LookIn:=xlValues, LookAt:=xlPart) If foundCell Is Nothing Then MsgBox "「東京」が見つかりませんでした。" Else MsgBox "ヒットした列番号: " & foundCell.Column End If End Sub

このQ&Aのポイント
  • 実家の母が入院して戻らないため、「ひかりTV基本放送プラン」を解約したい。現在、毎月5280円と2ヶ月毎に3300円が口座から引かれている。
  • テレビの解約だけでは2ヶ月毎の3300円しか解約できないとされており、全ての課金を解約したいと考えている。
  • ISPPぷららの「ひかりTV基本放送プラン」についての質問です。母の入院により解約を希望しています。
回答を見る

専門家に質問してみよう