【ExcelVBA】オートフィルタで抽出した行を削除
目次
サンプルデータ
都道府県データのダウンロード(zenkoku.csv)下記のようなCSVファイルです。

基本
.EntireRow.Delete で削除
オートフィルタで行を抽出して、表示されている行を削除します。『B列』が『青森県』である行を削除しています。
サンプルデータのファイルを開いたら、VBEの Module1 に丸ごと貼り付けてお試しください。
Sub 行抽出と行削除()
Dim KeyWord As String
Dim KeyColumn As Long
KeyColumn = 2 '←B列
KeyWord = "青森県" '←B列 青森県
'行抽出
ActiveWorkbook.ActiveSheet.UsedRange.AutoFilter _
Field:=KeyColumn, _
Criteria1:=KeyWord
'行削除
With ActiveWorkbook.ActiveSheet.Range("A1").CurrentRegion.Offset(1, 0)
.EntireRow.Delete
End With
ActiveWorkbook.ActiveSheet.Range("A1").AutoFilter 'オートフィルタ解除
End Sub
結果

※青森県が削除されています。
実行前のテーブル

応用
サンプルデータ(都道府県データ)は、ページ冒頭でダウンロードリンクがあります。.EntireRow.Delete で削除
下記は、サンプルデータのファイルを開いたら、VBEの Module1 に丸ごと貼り付けてお使いください。求まる結果は、上記の『基本』と同じです。下記は、シートをコピーしたり、オートフィルタを設置したり等が追加されています。
『B列』が『青森県』である行を削除しています。
Option Explicit
'###############################################################
'
' サンプルデータ(都道府県データ)は、HPに掲載してあります。
'
'###############################################################
Sub 主処理()
Application.ScreenUpdating = False '画面更新停止
Call シートコピー
Call オートフィルタ設置
Call 行抽出と行削除
Call オートフィルタ解除
Application.ScreenUpdating = True '画面更新再開
MsgBox "新しく作成されたシートが結果になります。", vbInformation
End Sub
'-----------------------------------------
' サンプルデータのシートコピー
'-----------------------------------------
Sub シートコピー()
ActiveWorkbook.Sheets("zenkoku").Copy After:=ActiveWorkbook.Sheets(Worksheets.Count)
End Sub
'-----------------------------------------
'オートフィルタをヘッダ行に設置する
'-----------------------------------------
Sub オートフィルタ設置()
If ActiveWorkbook.ActiveSheet.FilterMode = False Then
ActiveWorkbook.ActiveSheet.UsedRange.AutoFilter
End If
End Sub
'-----------------------------------------
'行抽出と行削除
'-----------------------------------------
Sub 行抽出と行削除()
Dim KeyWord As String
Dim KeyColumn As Long
KeyColumn = 2 '←B列
KeyWord = "青森県" '←B列 青森県
'行抽出
ActiveWorkbook.ActiveSheet.UsedRange.AutoFilter _
Field:=KeyColumn, _
Criteria1:=KeyWord
'行削除
With ActiveWorkbook.ActiveSheet.Range("A1").CurrentRegion.Offset(1, 0)
.Resize(.Rows.Count - 1).EntireRow.Delete
End With
End Sub
'-----------------------------------------
'オートフィルタ解除
'-----------------------------------------
Sub オートフィルタ解除()
ActiveWorkbook.ActiveSheet.UsedRange.AutoFilter
End Sub
.EntireRow.Delete の行削除が著しく遅いときの代替例
パソコンがロースペックの場合、.EntireRow.Delete メソッド処理が著しく遅くなるときがあります。そんなときは .EntireRow.Delete を使わないで済む方法があります。.EntireRow.Delete の代わりに 『行値クリア→行並び替え』 の順番で処理させます。これによって、ほぼ同様の結果が得られます。ほぼとは、並び替えが発生する点です。
下記のデメリットについて記載しておきます
- コードが長くなる。
- 並び替えが途中で必要なので、一意のコードが無いと順番が崩れる。
『B列』が『青森県』である行を削除しています。
Option Explicit
'###############################################################
'
' サンプルデータ(都道府県データ)は、HPに掲載してあります。
'
'###############################################################
Sub 主処理()
Application.ScreenUpdating = False '画面更新停止
Call シートコピー
Call オートフィルタ設置
Call 行抽出
Call 行値クリア
Call 行並び替え
Call 行罫線などクリア
Application.ScreenUpdating = True '画面更新再開
MsgBox "新しく作成されたシートが結果になります。", vbInformation
End Sub
'-----------------------------------------
' サンプルデータのシートコピー
'-----------------------------------------
Sub シートコピー()
ActiveWorkbook.Sheets("zenkoku").Copy After:=ActiveWorkbook.Sheets(Worksheets.Count)
End Sub
'-----------------------------------------
'オートフィルタをヘッダ行に設置する
'-----------------------------------------
Sub オートフィルタ設置()
If ActiveWorkbook.ActiveSheet.FilterMode = False Then
ActiveWorkbook.ActiveSheet.UsedRange.AutoFilter
End If
End Sub
'-----------------------------------------
'オートフィルタで行抽出
'-----------------------------------------
Sub 行抽出()
Dim KeyWord As String
Dim KeyColumn As Long
KeyColumn = 2 '←B列
KeyWord = "青森県" '←B列 青森県
ActiveWorkbook.ActiveSheet.UsedRange.AutoFilter _
Field:=KeyColumn, _
Criteria1:=KeyWord
End Sub
'-----------------------------------------
'抽出行の値クリア
'-----------------------------------------
Sub 行値クリア()
ActiveWorkbook.ActiveSheet.Range("A1").CurrentRegion.Offset(1, 0).ClearContents
ActiveWorkbook.ActiveSheet.Range("A1").AutoFilter 'オートフィルタ解除
End Sub
'-----------------------------------------
'行全体を並び替え(昇順:xlAscending)
'-----------------------------------------
Sub 行並び替え()
Dim SortColumn As Long
SortColumn = 1 '←A列 を基準にソート
ActiveWorkbook.ActiveSheet.Sort.SortFields.Clear
ActiveWorkbook.ActiveSheet.Sort.SortFields.Add2 Key:=Cells(1, SortColumn), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.ActiveSheet.Sort
.SetRange ActiveWorkbook.ActiveSheet.UsedRange
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End Sub
'-----------------------------------------
' サンプルデータに罫線などありませんが一応掲載
'-----------------------------------------
Sub 行罫線などクリア()
'テーブルの最終行付近に残る罫線をまとめてクリア
Dim TargetColumn As Long
TargetColumn = 1 '←A列にテーブルの最終行が存在するものとする(文字が存在するものとする)
With ActiveWorkbook.ActiveSheet.Cells(Rows.Count, TargetColumn).End(xlUp)
ActiveWorkbook.ActiveSheet.Range("A1").CurrentRegion.Offset(.Row).Clear
End With
End Sub




ディスカッション
コメント一覧
まだ、コメントがありません