8/02/2020

Excel。VBA。合計という文字がある集計行を削除したい。【EntireRow】

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を知っていくといいかもしれませんね。