10/22/2020

Excel。VBA。途中に小計がある表。データだけを削除するのが面倒なのでどうにかしたい。【SpecialCells】

Excel。VBA。途中に小計がある表。データだけを削除するのが面倒なのでどうにかしたい。

<Excel VBA:SpecialCells>

月報や日報を作るなど、Excelの表を使いまわしますが、その表の途中に小計などの集計行がある場合、そこを除いて、データを削除しなければなりません。

小計行などが少なければ、いいかもしれませんが、結構面倒な作業といえます。


例えば、次の表でみてみると、


 

6行目10行目と14行目を除いて範囲選択をしてデータ削除するわけですね。

Ctrlキーを使えば、離れたところを範囲選択して削除するだけなので、何ら問題はありませんが、とにかく面倒です。


このような単純で面倒な処理は、Excel VBAで対応するといいかもしれません。


しかも、基本的に、たった一行程度のプログラム文で作ることが出来てしまいます。


では、次のようなExcel VBAのプログラム文を作ってみましょう。


Sub 数値だけ削除()

    Dim lastrow As Long

    lastrow = Cells(Rows.Count, "c").End(xlUp).Row

    

    Range(Cells(2, "c"), Cells(lastrow, "c")).SpecialCells(xlCellTypeConstants, xlNumbers).ClearContents


End Sub


たったこれだけです。

とりあえず、実行して確認してみましょう。 


小計行の数式を残して、データのみを削除することができました。


小計行はだいたい、SUM関数をつかっていることが多いかもしれませんが、小計も含めて削除すると、SUM関数とはいえ、数が増えれば再度作るのは面倒なので、このExcel VBAのプログラム文は、使えるそうですね。


では、プログラム文を簡単に確認してみましょう。


最初は、お馴染みの変数宣言と、その変数への代入作業です。


Dim lastrow As Long

今回は、lastrow という変数を用意しました。


この変数に、データの最終行の行番号を設定します。

これで、どのぐらいの大きさのデータなのかがわかります。

lastrow = Cells(Rows.Count, "c").End(xlUp).Row


では、少々長いですが、メインとなるプログラム文を見ていきましょう。


Range(Cells(2, "c"), Cells(lastrow, "c")).SpecialCells(xlCellTypeConstants, xlNumbers).ClearContents


Range(Cells(2, "c"), Cells(lastrow, "c"))


ここで、C2からC列の最終行までを範囲選択しています。

Range(cells,cells)という形ですね。

Range(cells:cells)ではないので、注意しましょう。


SpecialCells(xlCellTypeConstants, xlNumbers)

SpecialCellsメソッドをつかうことで、指定した条件に合致するセルを取得することが出来ます。


「xlCellTypeConstants」は、定数が含まれているセルという意味で、さらに、「xlNumbers」で、数値だったらということなので、「xlCellTypeConstants, xlNumbers」は、数値が入力されているセルだったらという意味になります。


なお、「xlCellTypeFormulas」だと、数式が含まれているセルを指定することができます。

つまり、数式が入力されているセルと文字や数値が入力されているセルをわけて指示することが出来るわけです。


なので、範囲内に、数式があったとしても、合致しないので、削除対象から外れます。


そして、「ClearContentsメソッド」は、罫線や塗りつぶしなど書式はそのままで、データだけを削除することができます。


実質一行のExcel VBAのプログラム文なので、機会があれば、日頃面倒な処理をExcel VBAで対応してみるといいかもしれませんね。