12/13/2021

Excel。VBA。抽出や並べ替えにも影響が!表内に小計があるのでまとめて削除したい【Delete line】

Excel。VBA。抽出や並べ替えにも影響が!表内に小計があるのでまとめて削除したい

<Excel VBA>

テーブル機能や、ピボットテーブルをつかいたいけど、次の表のように、小計行や合計行があって、つかうことができません。


今回のデータのように、小計行2行。

合計行、合わせて3行を削除するぐらいならば、別に問題は無いのですが、大量に小計行がある場合には、イチイチ範囲選択しては削除するというのは、面倒以外の何物でもありません。


そこで、このような面倒な単純処理こそ、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行下のセルが上に繰り上がってしまいます。

このようにしないと、繰り返しを実行している途中なので、削除されずに残ってしまうなど、問題が発生してしまいます。


なので、最終行番号から「-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をつかって、マクロをつかってみるというのも、アリかもしれませんね。