Excelで指定した範囲の数字を含む行全てを削除したいです

以前、似たような質問をしたのですが。
今回は、例えば「G列に2~4999の数字があれば、その行全てを削除する」のように。
1つのキーワードではなく、指定した数字の範囲で行を削除できたらと考えております。
そのような効率的な処理がマクロや関数で可能でしたらお教えいただけますと幸いです。
よろしくお願い致します。

回答の条件
  • 1人10回まで
  • 登録:
  • 終了:2018/06/17 00:27:23
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。
id:moon-fondu

ちなみに以前の質問は http://q.hatena.ne.jp/1424769500 です。

ベストアンサー

id:Z1000S No.2

回答回数39ベストアンサー獲得回数27

ポイント1200pt

G列のデータが数値という前提で。

Public Sub deleteRows()

    Const LOWER_LIMIT       As Long = 2
    Const UPPER_LIMIT       As Long = 4999

    Const TARGET_SHEET_NAME As String = "Sheet1"
    Const TARGET_COL        As String = "G"
    Const HEADER_ROWS       As Long = 0

    Dim ws          As Worksheet
    Dim r           As Range
    Dim lHeaderRow  As Long
    Dim lTargetCol  As Long
    Dim lBeginRow   As Long
    Dim lEndRow     As Long

    Set ws = ThisWorkbook.Worksheets(TARGET_SHEET_NAME)

    With ws
        If .AutoFilterMode = True Then
            'オートフィルタ適用中なら解除
            .AutoFilter.Range.AutoFilter
        End If

        lTargetCol = .Columns(TARGET_COL).Column

        If HEADER_ROWS = 0 Then
            'ヘッダー行が無ければ、オートフィルタ用に1行挿入
            lHeaderRow = 1
            .Rows(lHeaderRow).Insert
            .Cells(lHeaderRow, lTargetCol).Value = "DummyHeader"
        Else
            lHeaderRow = HEADER_ROWS
        End If

        lBeginRow = lHeaderRow + 1
        
        lEndRow = .Cells(ws.Rows.Count, lTargetCol).End(xlUp).Row

        Set r = .Range(.Cells(lHeaderRow, lTargetCol), .Cells(lEndRow, lTargetCol))
    End With

    'オートフィルタ適用
    r.AutoFilter Field:=1, Criteria1:=">=" & CStr(LOWER_LIMIT), Operator:=xlAnd, Criteria2:="<=" & CStr(UPPER_LIMIT)

    '対象行があれば行削除
    If r.SpecialCells(xlCellTypeVisible).Count > 1 Then
        Application.DisplayAlerts = False

        'ヘッダ行を除外して、表示されている行を削除
        ws.Range(ws.Cells(lBeginRow, lTargetCol), ws.Cells(lEndRow, lTargetCol)).SpecialCells(xlCellTypeVisible).Delete

        Application.DisplayAlerts = True
    End If

    'オートフィルタ解除
    r.AutoFilter

    Set r = Nothing

    If HEADER_ROWS = 0 Then
        'オートフィルタ用ダミーヘッダー削除
        ws.Rows(1).Delete
    End If

    Set ws = Nothing

End Sub

削除対象範囲が変わるなら、こういうのもありかと・・・

Public Sub deleteRows(ByVal lLowerLimit As Long, ByVal lUpperLimit As Long)

とか

Public Sub deleteRows(ByVal sTargetCol As String, ByVal lLowerLimit As Long, ByVal lUpperLimit As Long)
id:moon-fondu

遅くなりましてすみません、ありがとうございます!
一瞬で消えて、うまくいきました(^^;

2018/06/16 22:52:50

その他の回答2件)

id:smithy250 No.1

回答回数45ベストアンサー獲得回数11

ポイント10pt

一日に何度もその処理を行うっていうならマクロのほうがいいと思うけどさ、
それって並び替えして行の削除するだけじゃん。
手間を惜しみすぎて一周回っちゃってるよ。MOSレベルは一通り勉強したほうがいいですよ

id:moon-fondu

そうですね、オートフィルって方法がありました!(^^;)

2018/06/05 22:06:00
id:Z1000S No.2

回答回数39ベストアンサー獲得回数27ここでベストアンサー

ポイント1200pt

G列のデータが数値という前提で。

Public Sub deleteRows()

    Const LOWER_LIMIT       As Long = 2
    Const UPPER_LIMIT       As Long = 4999

    Const TARGET_SHEET_NAME As String = "Sheet1"
    Const TARGET_COL        As String = "G"
    Const HEADER_ROWS       As Long = 0

    Dim ws          As Worksheet
    Dim r           As Range
    Dim lHeaderRow  As Long
    Dim lTargetCol  As Long
    Dim lBeginRow   As Long
    Dim lEndRow     As Long

    Set ws = ThisWorkbook.Worksheets(TARGET_SHEET_NAME)

    With ws
        If .AutoFilterMode = True Then
            'オートフィルタ適用中なら解除
            .AutoFilter.Range.AutoFilter
        End If

        lTargetCol = .Columns(TARGET_COL).Column

        If HEADER_ROWS = 0 Then
            'ヘッダー行が無ければ、オートフィルタ用に1行挿入
            lHeaderRow = 1
            .Rows(lHeaderRow).Insert
            .Cells(lHeaderRow, lTargetCol).Value = "DummyHeader"
        Else
            lHeaderRow = HEADER_ROWS
        End If

        lBeginRow = lHeaderRow + 1
        
        lEndRow = .Cells(ws.Rows.Count, lTargetCol).End(xlUp).Row

        Set r = .Range(.Cells(lHeaderRow, lTargetCol), .Cells(lEndRow, lTargetCol))
    End With

    'オートフィルタ適用
    r.AutoFilter Field:=1, Criteria1:=">=" & CStr(LOWER_LIMIT), Operator:=xlAnd, Criteria2:="<=" & CStr(UPPER_LIMIT)

    '対象行があれば行削除
    If r.SpecialCells(xlCellTypeVisible).Count > 1 Then
        Application.DisplayAlerts = False

        'ヘッダ行を除外して、表示されている行を削除
        ws.Range(ws.Cells(lBeginRow, lTargetCol), ws.Cells(lEndRow, lTargetCol)).SpecialCells(xlCellTypeVisible).Delete

        Application.DisplayAlerts = True
    End If

    'オートフィルタ解除
    r.AutoFilter

    Set r = Nothing

    If HEADER_ROWS = 0 Then
        'オートフィルタ用ダミーヘッダー削除
        ws.Rows(1).Delete
    End If

    Set ws = Nothing

End Sub

削除対象範囲が変わるなら、こういうのもありかと・・・

Public Sub deleteRows(ByVal lLowerLimit As Long, ByVal lUpperLimit As Long)

とか

Public Sub deleteRows(ByVal sTargetCol As String, ByVal lLowerLimit As Long, ByVal lUpperLimit As Long)
id:moon-fondu

遅くなりましてすみません、ありがとうございます!
一瞬で消えて、うまくいきました(^^;

2018/06/16 22:52:50
id:Asayuri No.3

回答回数309ベストアンサー獲得回数65

ポイント333pt

1.最終列の右に2列分挿入して、その1行目に次の関数式を入れます

  挿入した1列目には   =IF(AND(G1>=2,G1<=4999),"",1)
  挿入した2列目には   =ROW(G1)

2.挿入した1列目と2列目の1行目を コピーして
  挿入した1列目と2列目の2行目以降に 貼付けしてから
  挿入した1列目と2列目を コピーして 同じ位置に 値貼付けします 
 
3.挿入した1列目を昇順で並び替えします
 
4.挿入した1列目が空白になっている行について
  挿入した1列目と2列目を残して 範囲指定して すべて削除します
 
5.挿入した2列目を昇順で並び替えをします
 
6.挿入した1列目と2列目を削除します
 
  ご希望のデータが完成します。
 
 

id:moon-fondu

遅くなりましてすみません。
できました!ありがとうございます(^^;

2018/06/16 22:52:17
  • id:degucho
    どこかの列に
    =IF(AND((G1 >=2),(G1 <= 4999)),"○")
    というような式を入れてオートフィルタで○で絞って削除するのが
    簡単かと思います
    ※式はイメージなんで試してませんすみません
  • id:Z1000S
    >>
    2~4999の数字
    <<
    1.対象セルに入っている値は、「数字」、「数値」どちらでしょうか?
    2.「数字」(文字列)であるならば、具体的にどのような値がありますか?
      ぱっと思いつくだけで、以下のような判断出来ないパターンがあります。

      次のような値がある場合(あるならば)、削除対象となるのはどれですか?

      "6000":"600"は対象であるが、その後の"0"を含めると対象外となる
      "A2":アルファベット等が含まれる
      "12R5000":"12"は対象であるが、"5000"は対象ではない
      "-3":符号を含めると対象外となる
      "B-3":符号を含めると対象外となる

    処理自体は、前回の
    http://q.hatena.ne.jp/1424769500
    Mookさんのコードを踏襲し、

    If InStr(kt(r, 1), keyWord) = 0 Then

    の部分を変えるだけでも問題ないように思われます。
  • id:Z1000S
    でも、自分でやるなら、(条件次第だけど)オートフィルターが使えるなら、使うだろうなぁ
  • id:moon-fondu
    >deguchoさん
    FALSEが出てきました。後はこれで並び替えて抽出すればいい感じですね。

    >Z1000Sさん
    「数字」(文字列)になります。
     >"6000":"600"は対象であるが、その後の"0"を含めると対象外となる
     "6000"がある行も、"600"がある行も、必要ないです。
     >"A2":アルファベット等が含まれる
     アルファベット+数字の行も必要ありません。
     >"12R5000":"12"は対象であるが、"5000"は対象ではない
     数字+アルファベットも不要、"5000"の行も不要です。
     >"-3":符号を含めると対象外となる
     これも不要です。
     >"B-3":符号を含めると対象外となる
     これも不要ですね。
    でも確かに、重複を調べておりましたので、オートフィルタかけて「1」が
    隣りにある行を固まりにして、コピーすれば簡単に抽出できそうです(^^;)

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません