• ベストアンサー

行一括削除を早く行う、こんな方法できますか。

マクロによる行削除については、空白行の削除などいろいろな質問と 回答が出ていますが、データ量が多くなると自動化でもかなり時間が かかります。 そこで、ソートにより並べ替えを最初に行い、ある列に、最初に ある言葉や数字が出た行から最終行までを一括削除するマクロなら、 処理時間が早く出来ないかと思いました。 例えは、データA10からZ300で、並べ替えによりH列の最初に 日本という言葉が出たら、その行から最終300行までを一括削除 するという方法です。 (削除は行全体でもAからZまでの行、どちらでもよいです) そんな方法が出来るなら教えて下さい。よろしくお願いいたします。

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

  • ベストアンサー
  • ka_na_de
  • ベストアンサー率56% (162/286)
回答No.4

こんにちは。 2パターン作ってみました。 test1 はH10以降のH列の中で「日本」を探して そのセル以降のデータ行を削除します。 test2 は並び替えなしに、H10以降のH列に「削除」の文字を 探して、見つかった全ての行を複数選択して、最後にまとめて 削除します。 Unionを使った例です。 Sub test()   Dim c As Object   Dim myKey As String   Dim myRange As Range   Dim myFirstCell As Range   Dim myLastCell As Range   Set myFirstCell = Range("H10")   myKey = "日本"      Set myLastCell = Cells(Rows.Count, myFirstCell.Column).End(xlUp)   Set myRange = Range(myFirstCell, myLastCell)   Set c = myRange.Find(What:=myKey, LookIn:=xlValues, lookat:=xlPart, _               SearchOrder:=xlByColumns, MatchByte:=False)   If Not c Is Nothing Then     Range(c, myLastCell).EntireRow.Delete   End If   Set myRange = Nothing   Set c = Nothing   Set myFirstCell = Nothing   Set myLastCell = Nothing End Sub '============================================== Sub test2()   Dim c As Object   Dim myKey As String   Dim myRange As Range   Dim UnionRange As Range   Dim fAddress As String   Set myRange = Range("H10", Cells(Rows.Count, "H").End(xlUp))   myKey = "削除"   With myRange     Set c = .Find(What:=myKey, LookIn:=xlValues, lookat:=xlPart, _               SearchOrder:=xlByColumns, MatchByte:=False)     If Not c Is Nothing Then       fAddress = c.Address       Do         If UnionRange Is Nothing Then           Set UnionRange = c         Else           Set UnionRange = Union(c, UnionRange)         End If         Set c = .FindNext(c)         If c.Address = fAddress Then Exit Do       Loop       UnionRange.EntireRow.Delete     End If   End With   Set myRange = Nothing   Set UnionRange = Nothing   Set c = Nothing End Sub

hijtxa
質問者

お礼

早々のご教示ありがとうございました。 バッチリできました。 またパターン2について併せて作成していただき感激です。 本当にありがとうございました。

その他の回答 (4)

  • ka_na_de
  • ベストアンサー率56% (162/286)
回答No.5

#4です。 #3のtest2() ではFindメソッドで削除したい単語を検索してますが、 おそらく、オートフィルタで絞り込んで行一括削除したほうが早い気がします。 興味があれば試してみてください。 必要ならサンプルを作りますよ。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

こんにちは! 参考になるかどうか判りませんが・・・ 一例です。 A列全てを範囲指定し、列を挿入します。 元データが右に1列ずつずれますので、 元のH列がI列に移動します。 そして、A10セルに =IF(COUNTIF(I10,"日本*"),1,"") という数式を入れ、フィルハンドルでダブルクリックします。 これでI列が「日本」から始まるセルに「1」が表示されますので 当方使用のExcel2003の場合ですが データ → フィルタ → オートフィルタ で A列が「1」のものを抽出し、その行全てを削除します。 最後にオートフィルタを解除して、A列全てを削除すれば完了です。 もし、H列のセルに「日本」という文字列が含まれている という条件なら数式は変わってきます。 一気に!というわけにはいかないのですが、 参考になれば幸いです。 他に良い方法があれば読み流してくださいね。m(__)m

  • mar00
  • ベストアンサー率36% (158/430)
回答No.2

並べ替えにより範囲指定は終わっているので If Range("H10") = "日本" Then Selection.EntireRow.Delete End If を追加すればできると思います。

回答No.1

unionでもいいと思う

関連するQ&A