Excel。VBA。合計という文字がある集計行を削除したい。
<Excel VBA:EntireRowプロパティ>
同じパターンを単純に繰り返す作業をしていると、「面倒だなぁ~」「楽したいなぁ~」と思うものです。
例えば、次の表。
地域ごとの合計行が存在しています。
この合計行を削除した表を作りたいとします。
今回は、3行なので、たいしたことはありませんが、削除の行数がかなりある場合、面倒以外の何物でもありません。
このような場合は、マクロ。Excel VBAの出番ですね。
Excel VBAのプログラム文を次のように書いてみました。
Sub 合計行削除()
Dim i As Long
Dim lastrow
lastrow = Cells(Rows.Count, "c").End(xlUp).Row
For i = lastrow To 1 Step -1
If Cells(i, "a") Like "*合計" Then
Cells(i, "a").EntireRow.Delete
End If
Next i
End Sub
とりあえず、実行してみましょう。
合計行を削除することができましたね。
ちまちま削除するよりも、圧倒的に早くて楽ですね。
では、簡単にプログラム文を確認していきます。
お馴染みの変数宣言ですね。
Dim i As Long
Dim lastrow
lastrow = Cells(Rows.Count, "c").End(xlUp).Row
lastrowには、データの最終行番号を設定します。
これでデータが増減しても対応することができます。
このあとの繰り返し文のために、使います。
For i = lastrow To 1 Step -1
If Cells(i, "a") Like "*合計" Then
Cells(i, "a").EntireRow.Delete
End If
Next i
For To Next文で繰り返し処理をしています。
ここでポイントなのが、「Step -1」。
上位行から検索して該当した行を削除すると、1行下のセルが上に繰り上がってしまうので、その行が該当行の場合、削除されずに残ってしまいます。
今回は、数行ごとに合計という該当する行があるので、問題はないかもしれません。
Excel VBAのテクニックの一つとして、削除する場合は、下から上に行うというのがいいようです。
なので、最終行番号から「-1」しながら繰り返すようにしています。
If Cells(i, "a") Like "*合計" Then
合計という文字があるかどうかの判断をしているIf文ですね。
If Then EndIfで判定することができますね。
ここにもポイントがあります。
「Like "*合計"」
Cells(i, "a")=”合計” としてしまうと、合計という文字でないと実行されません。
今回は、都内合計とか余計なことをしてくれています。
全部合計という見出しだったらば、よかったのですが、今回は、見出しの一部に合計という文字があるかどうかです。
そこで、イコールの代わりに、Like演算子を使います。
イコールもそもそも演算子の一つですから、それを変更するだけです。
あとは、「合計という文字で終わる」と表現するために、「*(ワイルドカード)」を使えば条件行が完成です。
Cells(i, "a").EntireRow.Delete
このプログラム文の、EntireRow(エンタイアロウ)メソッドは該当する行全体を選択するプロパティで、Deleteメソッドで削除しています。
このように、数行で面倒な処理を時短で処理してくれるので、少しずつExcel VBAを知っていくといいかもしれませんね。