ray88’s diary

お仕事で困ったとき用の自分用の覚書

特定の文字列の入ったセルのある行を削除する

■以下の表のE列のステータスが「キャンセル」のデータについて行ごと削除するとします。
・行削除前
f:id:ray88:20200202151919p:plain
・行削除後
f:id:ray88:20200202151939p:plain
■上の行から削除すると変数「i」で参照する場所がどんどんズレて行くので、
 最終行から順にチェックして下から削除していくのがポイント。

Sub fncTargetRowDelete(strTarget As String, targetColumn As Integer, startRow As Integer)
  
  '------------------------------------------------
  '機能:特定の文字列の入ったセルのある行を削除する
  '引数1:対象の文字列
  '引数2:対象の文字列の存在する列
  '引数2:チェックする値の入っている列の先頭行
  '------------------------------------------------
  'カウント用変数
    Dim i As Long
    '最終行格納用変数
    Dim lastrow As Long
    
    '対象列の最終行を取得
    lastrow = Cells(Rows.Count, targetColumn).End(xlUp).Row
    
    '対象文字列の入ったセルのある行を下から順に削除
    For i = lastrow To startRow Step -1
        With Cells(i, targetColumn)
            If .Value = strTarget Then
               .EntireRow.Delete
            End If
        End With
    Next i
 End Sub

■ファンクションプロシージャの呼び出し元のプロシージャ

 Sub テスト()
 
     Dim strPath As String
     Dim strSheetName As String
     Dim wb As Workbook
     
     '対象シート名を設定
     strSheetName = "Sheet1"
     
     '他のブックを操作する場合。他のブックでない場合は点線で囲んだ部分をコメントアウト
     '-------------------------------------------------------------------
     '対象ブックのパスを設定
     strPath = "C:\Users\cryst\OneDrive\デスクトップ\テスト\注文.xlsx"
     Set wb = Workbooks.Open(strPath)
     '--------------------------------------------------------------------
     '対象シートをアクティブにする
     Sheets(strSheetName).Activate
     
    '呼び出し先プロシージャに引き数を渡す
     Call fncTargetRowDelete("キャンセル", 5, 2)
     
      '他のブックを操作する場合。他のブックでない場合は点線で囲んだ部分をコメントアウト
     '-------------------------------------------------------------------
     'ブックを保存して閉じる
     wb.Close True
     Set wb = Nothing
     '-------------------------------------------------------------------
     '他のブックではないときは以下のコードでブックを保存
      'ActiveWorkbook.Save
 
 End Sub