EXCEL VBA 複数の条件を満たす行を削除・空白削除・あいまい条件・0削除(行削除・列削除:Deleteメゾット)
EXCEL VBA 複数の条件を満たす行を削除・空白削除・あいまい条件・0削除:(行削除・列削除:Deleteメゾット)テクニック
今回説明するのは、Deleteメゾットの説明をいたします。EXCELに大量のデータが登録されている時に、データを整理する際に無駄なデータを手動で削除する事があると思いますが、手動だと数千件・数万件と言ったデータだとデータを整理するのが、大変だと思います。ここでEXCELの行単位・列単位で削除する機能が、Deleteメゾットになります。不必要なデータを削除する際に、条件設定をすることで、大量のデータも一気に削除する事もできます。それでは、サンプルプログラムを交えて順番に説明をいたします。
●【EXCEL VBA セルの挿入・行の挿入・列の挿入・セルの削除・行の削除・列の削除( Insert / Delete )については、下記を参照して下さい】
EXCEL VBA セルの挿入・行の挿入・列の挿入・セルの削除・行の削除・列の削除( Insert / Delete )
●【Application.Rows プロパティ (Excel)についは、下記を参照して下さい。Microsoft様】
https://docs.microsoft.com/ja-jp/office/vba/api/excel.application.rows
EXCEL VBA セルの削除・行の削除・列の削除( Deleteメゾット)
●Deleteメゾットを利用するには、下記の通りに設定を行います。
【行削除の例】
・ Rows(1).Delete
※1行目を削除
・ Range(”1:3”).Delete
※1~3行目を削除
・ Range(“C3”).EntireRow.Delete
※セル「C3」の行(3行目)を削除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
' ' Sub Delete_Rows01() Rows(1).Delete '1行目を削除 End Sub Sub Delete02() Range("1:3").Delete '1~3行目を削除 End Sub Sub Delete_Rows03() Range("C3").EntireRow.Delete 'セル「C3」の行(3行目)を削除 End Sub ' |
【列削除の例】
・ Columns(1).Delete
※A列目(1列名)を削除
・ Columns(“A”).Delete
※A列目を削除
※1~3行目を削除
・ Range(“C3”).EntireRow.Delete
※セル「C3」の行(3行目)を削除
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
' ' Sub Delete_Col01() Columns(1).Delete 'A列目を削除 End Sub Sub Delete_Col02() Columns("A").Delete 'A列目を削除 End Sub Sub Delete_Col03() Columns("A:C").Delete 'A列目~C列を削除 End Sub Sub Delete_Col04() Range("C3").EntireColumn.Delete 'C3の列を削除 (C列を削除) End Sub ' |
EXCEL VBA 条件を満たす行を削除・空白削除:Deleteメゾット①
下記のサンプルプログラムは、データ内に空白のセルが有る場合に、その行を削除するサンプルプログラムです。
【削除条件】
・空白セルに該当する行を削除します。
【プログラムの流れ】
① 表のA列の最終行を取得します。
② A列の最終行から2行目まで繰り返します。
③ 表の最終行から順番にA列のセルが空白か確認します。
④ A列のセルに空白が有れば、その行を削除します。
⑤ 2行目まで繰り返します。②へ
【プログラム実行条件】
・A列にデータを登録します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
' ' Sub Delete_Rows10() 'A列の空白行を削除します。 Dim I, lRow As Long lRow = Cells(Rows.Count, "A").End(xlUp).Row 'A列の最終行を取得します。 For I = lRow To 2 Step -1 '最終行から2行目まで繰り返す。 If IsEmpty(Cells(I, "A").Value) Then 'A列の空白行を判定します。 Rows(I).Delete '該当(空白)する行を削除します。 End If Next I End Sub ' |
(画面クリックして拡大)
EXCEL VBA 条件を満たす列を削除:Deleteメゾット②
下記のサンプルプログラムは、データ内(見出し)に指定し文字列【性別】が登録されている列を順番に探して見つかった場合に、その列を削除するサンプルプログラムです。
【削除条件】
・見出しに指定した文字列(性別)に該当する列を削除します。
【プログラムの流れ】
① 表の1行目の最終列を取得します。
② 1行目の最終行から1列目まで繰り返します。
③ 表の最終列から順番に1行目のセルに”性別”か確認します。
④ 1行目のセルに”性別”が有れば、その列を削除します。
⑤ 1列目まで繰り返します。2へ
【プログラム実行条件】
・1行目の列に「性別」の文字を登録します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
' ' Sub Delete_Col10() '指定した文字列の列を削除します。 Dim I, lCol As Long lCol = Cells(1, Columns.Count).End(xlToLeft).Column '1行目の最終列を取得します。 For I = lCol To 1 Step -1 '最終行から1列目まで繰り返す。 If Cells(1, I) = "性別" Then '性別の列を判定します。 Columns(I).Delete '該当する列を削除します。 End If Next I End Sub ' |
(画面クリックして拡大)
EXCEL VBA 条件を満たす行を削除・0(ゼロ)削除:Deleteメゾット③
下記のサンプルプログラムは、数値の”0”が登録されている行を削除します。文字列の”0”と計算結果でも”0”とみなし該当の行を削除します。
【削除条件】
・指定した列に”0”が登録されている行を削除します。
【プログラムの流れ】
① 表の1行目の最終行を取得します。
② 最終行から2行目まで繰り返します。
③ 表の最終行から順番に2行目までのセルに”0”が有るか確認します。
④ 該当するセルに”0”が有れば、その行を削除します。
⑤ 2行目まで繰り返します。②へ
【プログラム実行条件】
・E列に0データを登録する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
' ' Sub Delete_Rows20() '合計金額がゼロ0円の行を削除します。 Dim I, lRow As Long lRow = Cells(Rows.Count, "A").End(xlUp).Row 'A列の最終行を取得します。 For I = lRow To 2 Step -1 '最終行から2行目まで繰り返す。 If Cells(I, "E") = 0 Then 'E列の0(ゼロ)を判定します。 Rows(I).Delete '該当する行を削除します。 End If Next I End Sub ' |
(画面クリックして拡大)
EXCEL VBA 複数条件を満たす行を削除:Deleteメゾット④
下記のサンプルプログラムは、複数条件に一致する行を削除します。
【削除条件】
・東京支店又は神奈川支店と合計金額が0円のデータを削除します。
【プログラムの流れ】
① 表の1行目の最終列を取得します。
② 最終行から2行目まで繰り返します。
③ 表の最終行から順番にセルデータに【東京支店又は神奈川支店か合計金額が0円のデータ】か確認します。
④ 削除条件に一致する行を削除します。
⑤ 2行目まで繰り返します。②へ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
' ' Sub Delete_lRow30() '複数条件を満たす行を削除 Dim I, lRow As Long lRow = Cells(Rows.Count, "A").End(xlUp).Row '1行目の最終列を取得します。 For I = lRow To 2 Step -1 '最終行から1列目まで繰り返す。 If (Cells(I, "A") = "東京支店" Or Cells(I, "A") = "神奈川支店") _ Or Cells(I, "E") = 0 Then '東京支店又は神奈川支店と合計が0円の行が削除されます。 Rows(I).Delete '該当する列を削除します。 End If Next I End Sub ' |
(画面クリックして拡大)
EXCEL VBA あいまい条件を満たす行を削除:Deleteメゾット⑤
下記のサンプルプログラムは、【備考」のD列に【削除】または、【DEL】の文字列が含まれている場合は、その行を削除します。
【削除条件】
・D列の【備考】に【削除】または、【DEL】の文字列が含まれている場合、その行を削除します。
【プログラムの流れ】
① 表のA列の最終列を取得します。
② A列の最終行から2行目まで繰り返します。
③ D列の最終行から順番に2行目までに、【備考】に「削除」又は、「DEL」の文字列が含まれるか確認します。
④ D列「備考」に該当する「削除」・「DEL」が含まれている場合は、その行を削除します。
⑤ 2行目まで繰り返します。②へ
【プログラム実行条件】
・D列の【備考】列に「削除」・「DEL」の文字が含まれる文字列を登録します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
' ' Sub Delete_lRow40() 'あいまし条件を満たす行を削除 Dim I, lRow As Long lRow = Cells(Rows.Count, "A").End(xlUp).Row '1行目の最終列を取得します。 For I = lRow To 2 Step -1 '最終行から1列目まで繰り返す。 If (Cells(I, "D") Like "*削除*" Or Cells(I, "D") Like "*DEL*") Then 'セルに削除又は、DELの文字が登録されていれば、削除します。 Rows(I).Delete '該当する列を削除します。 End If Next I End Sub ' |
(画面クリックして拡大)
EXCEL VBA 特定期間を満たす行を削除:Deleteメゾット⑥
下記のサンプルプログラムは、特定期間(2021年6月11日から2021年9月11日)までの日付が登録されている行を削除します。
【削除条件】
・A列の【日付】に特定期間(2021年6月11日から2021年9月11日)が登録されている。その行を削除します。
【プログラムの流れ】
① 表のA列の最終列を取得します。
② A列の最終行から2行目まで繰り返します。
③ A列の最終行から順番に2行目までに、【日付】を確認して特定期間に含まれるか確認します。
④ A列「日付」が設定した特定期間に含まれている場合は、その行を削除します。
⑤ 2行目まで繰り返します。②へ
【プログラム実行条件】
・A列の【日付】列に日付を登録します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
' ' Sub Delete_lRow50() '特定期間を満たす行を削除 Dim I, lRow As Long lRow = Cells(Rows.Count, "A").End(xlUp).Row '1行目の最終列を取得します。 For I = lRow To 2 Step -1 '最終行から1列目まで繰り返す。 If (Cells(I, "A") >= #6/11/2021# And Cells(I, "A") <= #9/11/2021#) Then '”2021/6/11~2021/9/11”までの間のデータを削除する。 Rows(I).Delete '該当する列を削除します。 End If Next I End Sub ' |
(画面クリックして拡大)
EXCEL VBA 削除対象を表示してから削除:Deleteメゾット⑦
下記のサンプルプログラムは、プログラム実行後、削除対象の行番号と該当者をメッセージボックスに確認表示してから該当の行(データ)を削除するサンプルプログラムです。削除実行前に、確認する事で誤って削除する事も軽減する事も出来ます。
【削除条件】
・F列の「退職」に”●”の印のある行が削除対象になります。
※今回のプログラムについては、該当する行を削除する前に、メッセージボックスに削除対象を表示してから削除を行います。
【プログラムの流れ】
① 表のA列の最終行を取得します。
② A列の最終行から2行目まで繰り返します。
③ 配列に削除対象を登録する件数分(A列の最終行分を用意)
④ 登録する配列番号の初期設定0~
⑤ 削除対象の行番号と氏名を文字列変数(Del)へ追記登録します。
⑥ 配列に削除対象の行番号を登録します。
⑦ 最終行から2行目まで繰り返します。②へ
⑧ 削除対象が抽出されたので、メッセージボックスに削除対象を表示します。
⑨ メッセージボックスの判定で「OK」で削除を実行します。
⑩ 配列に登録れている削除対象の行を読み込み対象行を削除します。
⑪ 配列に登録されている行データ全てを削除します。⑩へ
【プログラム実行条件】
・F列の【退職】列に削除対象として”●”を登録します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
' ' Sub Delete_lRow60() '削除対象を表示してから削除 Dim I, L, lRow, Hantei As Long Dim del As String Dim ArrayData() lRow = Cells(Rows.Count, "A").End(xlUp).Row '1行目の最終列を取得します。 ReDim ArrayData(lRow) '配列を再定義します。(A列の件数分:配列用意) L = 0 ’登録する配列番号の初期設定0~ For I = lRow To 2 Step -1 '最終行から2行目まで繰り返す。 If Cells(I, "F") = "●" Then del = del & I & "行目の" & Cells(I, "B") & "さんを削除" & vbLf '削除対象の行番号と氏名を文字列変数(Del)へ追記登録します。 ArrayData(L) = I '配列に削除対象の行番号を登録します。 L = L + 1 '配列の登録位置を加算します。 End If Next I Hantei = MsgBox(del & "上記の行を削除しますか?", vbOKCancel) If Hantei = vbOK Then '削除対象の削除行を順番削除します。 For I = 0 To UBound(ArrayData) '配列に登録された分繰り返します。 If ArrayData(I) <> 0 Then '配列に削除対象の行番号を確認します。 Rows(ArrayData(I)).Delete '該当する列を削除します。 End If Next I End If End Sub ' |
(画面クリックして拡大)
また、VBAに関するテクニックや便利な手法などをこのサイトに掲載していきますので、定期的に参照していただけると幸いです。