エクセルVBA100本ノック。4本目:セルの消去2
この記事から得るもの
計算式が入っているセルは削除せずに、データ(定数)が入っているセルのみを削除する方法が分かる。
1 今回のお題
画像のように1行目に見出し、A列に№が入っています。
この表範囲の一部には計算式が入っています。
(画像の最下行とD列には数式が入っています。)
データ行数は毎回変化します。
見出し行とA列№と計算式は残し、定数値だけを消去してください。
※画像ならB2:C11を消去
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があります。
このSheetに対して、以下のSelectを実行します。
Sub Kouさんの回答() Range("A1").CurrentRegion.Offset(1, 1).SpecialCells(xlCellTypeConstants).Select End Sub
以下の画像の通りデータ部だけ選択されていることが分かります。
つまり、CELLにもいろいろな種類を指定して処理ができるということですね!