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をつかって、マクロをつかってみるというのも、アリかもしれませんね。