Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 7全般 : Excel 2007)
指定行間内で検索し、行を削除する方法
投稿日時: 18/04/13 17:26:35
投稿者: いわちゃん

日々データを格納しているファイルがあります。
 
A列に「本日分データ」というフラグ文字があり、そこからデータのある最終行までの間でD列に「東京」「神奈川」が文字があったら、行削除したいです。
 
行を削除する方法とフラグ開始行、最終行の取得方法はわかりましたが、どう組みあせたら良いのかわかりません。
ご教示お願いします。
 
 
    開始行 = Range("A:A").Find("本日分データ").Row
    最終行 = Cells(Rows.Count, 1).End(xlUp).Row
 
 
Sub 条件に一致した行を削除する()
 Dim i As Long
 For i = Range("A1").End(xlDown).Row To 2 Step -1
 With Cells(i, "D")
  If _
  .Value Like "東京*" Or _
  .Value Like "神奈川*" Then
   .EntireRow.Delete
  End If
 End With
 Next i
End Sub

回答
投稿日時: 18/04/13 17:46:48
投稿者: よろずや

For i = 終了行 To 開始行 Step -1
でいいのでは

回答
投稿日時: 18/04/13 19:09:55
投稿者: もこな2

私も、よろずやさんのおっしゃるとおりで良いと思います。

Sub 条件に一致した行を削除する()
    Dim i As Long
    Dim 開始行 As Long
    Dim 最終行 As Long

    開始行 = Range("A:A").Find("本日分データ").Row
    最終行 = Cells(Rows.Count, 1).End(xlUp).Row

    For i = 最終行 To 開始行 Step -1
        With Cells(i, "D")
            If .Value Like "東京*" Or .Value Like "神奈川*" Then _
                .EntireRow.Delete
        End With
    Next i
End Sub

ただ、開始行を探すのにFindメソッドを使ってますので、見つからなかったときには
Rowを返せず実行時エラーが発生します。
そこをどう処理するのか考えてから運用したほうが良いと思います。
 
また、Findメソッドの引数を省略していますが、思わぬ失敗をすることがありますので、
挙動について理解はしておいた方がよいとおもいます。
 
【参考】
検索に失敗するとき(Findメソッドの引数省略時に起きる失敗)
https://www.moug.net/tech/exvba/0150111.html

回答
投稿日時: 18/04/14 12:04:42
投稿者: mattuwan44

このような時は、
エクセル的には、削除したいデータをオートフィルターで抽出し削除します。
 
Sub test()
    Dim ixRow As Long
     
    On Error Resume Next
    ixRow = WorksheetFunction.Match("本日分データ", Columns(1), 0)
    On Error GoTo 0
    If ixRow = 0 Then Exit Sub
     
    With ActiveSheet.UsedRange
        With Intersect(.Cells, .Offset(ixRow - 1))
            .AutoFilter Field:=4, Criteria1:="東京*", Operator:=xlOr, Criteria2:="神奈川"
            If .Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count > 1 Then
                Application.DisplayAlerts = False
                .Offset(1).Delete
                Application.DisplayAlerts = True
            End If
            .AutoFilter
        End With
    End With
End Sub

投稿日時: 18/04/16 13:14:08
投稿者: いわちゃん

ありがとうございます。やりたいことができました!
 
続けて下記の処理をしたいのですが、うまくいきません。
ご教示お願いします。
 
 
D列=「東京」 で F列が「中央区」か「港区」だったら、行を削除
D列=「神奈川」 で F列が「西区」だったら、行を削除
・・・他にも関東県分データがあり、同様に削除したいです。
 
sub 東京()
 
    Dim i As Long
    Dim 開始行 As Long
    Dim 最終行 As Long
    Dim ku As string
 
  ku = "中央区" Or "港区"
 
    開始行 = Range("A:A").Find("本日分データ").Row
    最終行 = Cells(Rows.Count, 1).End(xlUp).Row
 
    For i = 最終行 To 開始行 Step -1
  If .Cells(i, "F") = "東京" And Cells(i, "F") = ku Then .EntireRow.Delete
    Next i
 
End Sub

回答
投稿日時: 18/04/16 14:37:18
投稿者: mattuwan44

>・・・他にも関東県分データがあり、同様に削除したいです。
 
そういう事ならフィルターオプションで残したいものだけ別のシートに抽出してみては?
 
そうじゃなくて、今のマクロを生かして、
VBAの勉強をしたいということですか?
 
どちらにしても、
残したいものか、
削除したい物のリストをシート上に作った方が、
次々追加になるならメンテナンスしやすいと思いますがいかがでしょうか?
 

回答
投稿日時: 18/04/16 15:03:01
投稿者: mattuwan44

Sub 条件に一致した行を削除する3()
    Dim rngList As Range '一覧表のセル範囲
    Dim c As Range '各セル
    Dim flg As Boolean '削除フラグ
     
    For i = Cells(Rows.Count).End(xlUp).Row To 2 Step -1
        flg = False
        With Cells(i, "D")
            Set c = .Offset(, 2)
            If .Value = "東京都" Then
                Select Case c.Value
                    Case "中央区", "港区": flg = True
                End Select
            ElseIf .Value = "神奈川県" Then
                Select Case c.Value
                    Case "中央区", "港区": flg = True
                End Select
            ElseIf .Value = "大阪府" Then
                Select Case c.Value
                    Case "??区": flg = True
                End Select
            End If
            If flg = True Then Rows(i).Delete
        End With
    Next i
End Sub
 
いっぱい条件があるなら、ElseIfで条件を書き足すか、
Select Case を使う。
 
また、Or条件が多いならSelect Case の方が簡潔に書けるので、便利です。
 
しかし、フィルターオプションの機能で処理する方が、
マクロで自動処理するにしても、手動でやるにしてもおすすめではあります。
あと、元のデータを削除するのは怖いのでコピーしてから削除するか、
必要な物だけコピーした方がいいと思います。

回答
投稿日時: 18/04/16 15:04:34
投稿者: mattuwan44
トピックに返信