重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

マクロによる行削除については、空白行の削除などいろいろな質問と
回答が出ていますが、データ量が多くなると自動化でもかなり時間が
かかります。
そこで、ソートにより並べ替えを最初に行い、ある列に、最初に
ある言葉や数字が出た行から最終行までを一括削除するマクロなら、
処理時間が早く出来ないかと思いました。

例えは、データA10からZ300で、並べ替えによりH列の最初に
日本という言葉が出たら、その行から最終300行までを一括削除
するという方法です。
(削除は行全体でもAからZまでの行、どちらでもよいです)

そんな方法が出来るなら教えて下さい。よろしくお願いいたします。

A 回答 (5件)

こんにちは。



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
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/03/06 17:00

#4です。



#3のtest2() ではFindメソッドで削除したい単語を検索してますが、
おそらく、オートフィルタで絞り込んで行一括削除したほうが早い気がします。

興味があれば試してみてください。

必要ならサンプルを作りますよ。
    • good
    • 0

こんにちは!


参考になるかどうか判りませんが・・・
一例です。

A列全てを範囲指定し、列を挿入します。
元データが右に1列ずつずれますので、
元のH列がI列に移動します。

そして、A10セルに
=IF(COUNTIF(I10,"日本*"),1,"")
という数式を入れ、フィルハンドルでダブルクリックします。
これでI列が「日本」から始まるセルに「1」が表示されますので
当方使用のExcel2003の場合ですが
データ → フィルタ → オートフィルタ で
A列が「1」のものを抽出し、その行全てを削除します。
最後にオートフィルタを解除して、A列全てを削除すれば完了です。

もし、H列のセルに「日本」という文字列が含まれている という条件なら数式は変わってきます。

一気に!というわけにはいかないのですが、
参考になれば幸いです。
他に良い方法があれば読み流してくださいね。m(__)m
    • good
    • 0

並べ替えにより範囲指定は終わっているので



If Range("H10") = "日本" Then
Selection.EntireRow.Delete
End If

を追加すればできると思います。
    • good
    • 0

unionでもいいと思う

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!