• ベストアンサー

マクロで特定の文字を含む行を削除の方法

マクロについて教えてください。(初心者です) B列にある、特定の文字(ランダムに複数の文字あります)がある場合、その行ごと削除 するマクロを教えてください。 例えば、 <B列> 2015-001 2015-002 2015-003 2015-004 と、数値があります。 2015-0002 2015-0003 の行を削除したいです。 削除対象の文字はランダムに40こほどあります。 宜しくお願いします。

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

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

いろいろなやり方(構想というかメソッドというか)が考えられる。下記はあくまで簡単そうな1案。 「多対多」行データを、一遍でマッチングして、存在の有無を検出できる方法は、多分ないと思うので、繰り返し法を使うことになるだろう。 もしFind(メソッドという)を使わないないなら、2重ループの繰り返しで処理する。(初心者に一番わかりやすい方法とは思う。Find≫メソッドはむつかしい) 両データを各々ソートして、データマッチング法で、あり場所=行を割り出す方法もある。 ーーー 下記は Sheet2のA列に 2015-0002 2015-0003 などを、あらかじめ入れておく場合です。 ほかに配列に入れる、プログラムコードに書くなどいろいろな方法が考えられる。 どこに置くか、それを質問に書いておかないと、質問として不十分だろう。 小生は、うっかりSheet1のG列に削除すべきデータを入れて、うまくできたと思って、誤って回答を上げてしまうところだった。削除するデータ行(G列データ)がRows(i).Delete で削除されてしまう場合がありうるので要注意。(データ削除問題は初心者には、むつかしいと言いたい) 下記のような方法は、毎行ごと繰り返し法といえるが、下の行から上に駆け上がるように 処理するのがコツ。なぜか考えてみて。経験からおみつく思いつくものだが、初心者には思いつくかな。 ーーー 標準モジュールに Sub test01() lr = Worksheets("Sheet1").Range("B100000").End(xlUp).Row '元データ最終行番号 lrb = Worksheets("Sheet2").Range("A1000").End(xlUp).Row '削除データ列(A列にあるとする)最終行番号 MsgBox lr '確認用 Dim x As Range For i = lr To 2 Step -1 'データ最下行から上へ (第2行目からデータ開始とする) Set x = Worksheets("Sheet2").Range("A2:A" & lrb).Find(Worksheets("Sheet1").Cells(i, "B")) 'G列にあるか If x Is Nothing Then '見つからなければ(何もしない) Else '見つかれば Worksheets("Sheet1").Rows(i).Delete '行削除 End If Next i End Sub ーー 元データのおおよその行数なども書いておいてほしい。1万以下、10万台、100万台 など。方法により、処理に時間がかかる場合もありそうなので。 ーー ほかに >特定の文字(文字?) >数値があります(数値?) >ランダムに40(ランダムとは?) に引っかかったが、深追いしていない。

その他の回答 (2)

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

#2です。 別のロジックの解法を挙げます。 最下行から上行に探して削除するのが奇抜なような気もして下記を考えてみました。 「削除」などの問題は、取り消し操作が効かない場合が多く、元データはコピーして残しておいて、テストをやってください。 Sheet1のA列に元データがあり、Sheet2のA列に削除すべき内容があるとします。 Sub test02() Worksheets("Sheet1").Activate a = "" lr = Worksheets("Sheet2").Range("A10000").End(xlUp).Row For i = 2 To lr x = Worksheets("Sheet2").Range("A" & i) Set y = Worksheets("Sheet1").Range("A1:A100").Find(x) If y Is Nothing Then Else a = a & "A" & y.Row & "," End If Next i a = Left(a, Len(a) - 1) MsgBox a Worksheets("Sheet1").Range(a).EntireRow.Delete End Sub 上記は一種の「ため込み方式」なので、蓄える「削除すべきデータ」数量(行)には限度があるので、多量の削除行がある場合は要注意ですが。 小生は、プログラムで、基本的に「ため込み方式」は避けて考えています。 ただし、削除作業(Delete)が最後にまとめて1回なので、良い面もあるかも。

  • t-aka
  • ベストアンサー率36% (114/314)
回答No.1

削除の規則性を明記しないと難しいですよ。 同じ作業を繰り返すことはプログラムの得意分野です。 一方で、毎回毎回違ったことをするのであれば、自分自身で取り組んだほうが確実だし、まだ正確です。 それに、あれこれ考えているうちに、手作業で済ませたほうが早い可能性もあります。 マクロも道具の一つです。 使用用途に応じた使い方を検討するべきでしょう。 規則性を見出し、定型作業化できるのであれば マクロは有意義な機能の一つとなるでしょう。

関連するQ&A