Public Sub 最終行まで条件付き行削除()
Dim lastRow As Long
Dim i As Long
lastRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
For i = lastRow To 2 Step -1
If ActiveSheet.Cells(i, 7).Value <> "送付対象" Then
ActiveSheet.Rows(i).Delete
End If
Next i
End Sub
If ActiveSheet.Cells(i, 7).Value <> "送付対象"で条件を設定しています。
列は左から○番目で数える
Cells(i, 7)は(行,列)の順番で書かれています。
参照する列を変えたい場合は「7」を変更してください。
行削除の条件を変えたい場合は、.Value <> "送付対象"を変更します。
変更例は次のとおりです。
<>”送付対象”:送付対象「以外」を削除
=”送付対象”:送付対象を削除する
<10:10未満を削除
>=10:10以上を削除
このマクロを実行すると、送付対象「以外」の行が削除されます。
送付対象の行が残る
前章の注意点のとおり、「下から上」に繰り返し処理をすることが失敗しないコツです。
「最終行まで繰り返し処理」と聞くとDo~Loopのループ処理を思い浮かべる方もいるかもしれません。
ですが、Do~Loopは条件を書き間違えると止まらないマクロになります。
今回のように事前に最終行が分かる場合は、For~Nextループを使うほうが安心です。
空白行をマクロで安全に削除するコツ
空白行をVBAで削除するときに注意すべき点は、「空白」の種類がいくつかあるということです。
セルに情報が何も入っていない
見た目は空白でもスペースが入っている
=IF(A1="", "", A1)など、セルに数式が入っていても表示が空白
上記が混在している状態で、以下のコードで行削除すると、結果も混在してしまいます。
Public Sub 空白行削除スペースは残る()
Dim lastRow As Long
Dim i As Long
lastRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
For i = lastRow To 2 Step -1
If ActiveSheet.Cells(i, 7).Value = "" Then
Rows(i).Delete
End If
Next i
End Sub
Public Sub 空白行削除スペースも削除()
Dim lastRow As Long
Dim i As Long
lastRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
For i = lastRow To 2 Step -1
If Trim(ActiveSheet.Cells(i, 7).Value) = "" Then
ActiveSheet.Rows(i).Delete
End If
Next i
End Sub
Public Sub 空白行削除数式は残す()
Dim lastRow As Long
Dim i As Long
lastRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
For i = lastRow To 2 Step -1
If Not ActiveSheet.Cells(i, 7).HasFormula Then
If Trim(ActiveSheet.Cells(i, 7).Value) = "" Then
ActiveSheet.Rows(i).Delete
End If
End If
Next i
End Sub
If Not Cells(i, 7).HasFormula Thenに書かれている.HasFormulaとは、そのセルに数式が入っているかどうかを調べるためのものです。
If Not Cells(i, 7).HasFormula Thenと書くことで、数式が入っていないセルだけを対象にすることができます。
重複行を削除するポイントと考え方
重複行を削除するVBAを作るポイントは、判定基準を先に明確にすることです。
例えば、A列のみ重複している場合や、A列・B列・C列すべてが重複している場合などです。
ここでは、実務でよく使われる「複数列で重複判定するコード」をご紹介します。
Sub 複数列で重複行を削除()
Dim i As Long
Dim lastRow As Long
Dim dict As Object
Dim key As String
Set dict = CreateObject("Scripting.Dictionary")
lastRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
For i = lastRow To 2 Step -1
key = ActiveSheet.Cells(i, 1).Value & "|" & ActiveSheet.Cells(i, 2).Value & "|" & ActiveSheet.Cells(i, 3).Value
If dict.Exists(key) Then
ActiveSheet.Rows(i).Delete
Else
dict.Add key, True
End If
Next i
End Sub
Public Sub 結合セルを解除して行削除()
Dim lastRow As Long
Dim i As Long
lastRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Row
For i = lastRow To 2 Step -1
If ActiveSheet.Cells(i, 7).Value <> "送付対象" Then
If ActiveSheet.Rows(i).MergeCells Then '結合セルの有無を確認
ActiveSheet.Rows(i).UnMerge '結合セルを解除
End If
ActiveSheet.Rows(i).Delete
End If
Next i
End Sub