エクセルVBA100本ノック。4本目:セルの消去2

この記事から得るもの

計算式が入っているセルは削除せずに、データ(定数)が入っているセルのみを削除する方法が分かる。


1 今回のお題

画像のように1行目に見出し、A列に№が入っています。
この表範囲の一部には計算式が入っています。
(画像の最下行とD列には数式が入っています。)
データ行数は毎回変化します。
見出し行とA列№と計算式は残し、定数値だけを消去してください。
※画像ならB2:C11を消去

f:id:bimori466:20201104090903p:plain

excel-ubara.com

2 今回のお題の意図

Cellには種類があるということを、理解してほしいのだと思いました。
空白セル、定数が含まれているセル、数式が含まれているセル、コメントが含まれているセルなどなど。
今回は、定数が含まれているセルを消しなさいよ!という意図だと理解しました。

3 回答

私の最初に作成した回答

Sub データ削除4()

Dim Ws As Worksheet: Set Ws = Worksheets("sheet2")

RowLastLine = Ws.Cells(Rows.Count, 2).End(xlUp).Row
ColumnLastLine = Ws.Cells(1, Columns.Count).End(xlToLeft).Column

Ws.Range(Ws.Cells(2, 2), Ws.Cells(RowLastLine - 1, ColumnLastLine - 1)).ClearContents

End Sub

前回の3本目の使いまわしです。
Range(Ws.Cells(2, 2), Ws.Cells(RowLastLine - 1, ColumnLastLine - 1))、と最終行、列からー1すれば、データの入っている部分だけ削除できます。
一応今回のお題はクリアだと思いますが、お題の意図が分かっていない回答になっています。

データが無い場合のエラーを発見!

データが未入力の場合、見出しを削除してしまうというエラーを発見しました。

エラー対応の修正版↓↓

Sub データ削除4()

Dim Ws As Worksheet: Set Ws = Worksheets("sheet2")

RowLastLine = Ws.Cells(Rows.Count, 2).End(xlUp).Row: If RowLastLine < 2 Then RowLastLine = 3
ColumnLastLine = Ws.Cells(1, Columns.Count).End(xlToLeft).Column

Ws.Range(Ws.Cells(2, 2), Ws.Cells(RowLastLine - 1, ColumnLastLine - 1)).ClearContents

End Sub

If RowLastLine < 2 Then RowLastLine = 3を追加。
最終列が、2より小さい場合は、3に置き換えます。

4 お題の意図が分かっている回答

またまた、Kou Excelが大好きだ!さんの回答です。

Kouさんの回答

Sub Kouさんの回答()

Range("A1").CurrentRegion.Offset(1, 1).SpecialCells(xlCellTypeConstants).ClearContents

End Sub

ポイントは、SpecialCells(xlCellTypeConstants)です。
意味は、定数が含まれているセルということです。
つまり、Range("A1").CurrentRegion.Offset(1, 1)で全選択しますが、数式の入っている部分は削除されません。
加えて、1行で記述されている点がスマートですね。

SpecialCells(xlCellTypeConstants).Selectで選択部分を確認してみる。

以下のSheetがあります。
f:id:bimori466:20201104094746p:plain

このSheetに対して、以下のSelectを実行します。

Sub Kouさんの回答()

Range("A1").CurrentRegion.Offset(1, 1).SpecialCells(xlCellTypeConstants).Select

End Sub

以下の画像の通りデータ部だけ選択されていることが分かります。
f:id:bimori466:20201104095100p:plain


つまり、CELLにもいろいろな種類を指定して処理ができるということですね!