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

こちらで公開されている、100本ノックに挑戦。
www.excel-ubara.com
素晴らしい教材を公開いただき、ありがとうございます。

上記リンク先から、問題文を転載。
f:id:Infoment:20220109172233p:plain

3本目では1行目とA列以外の値を消去したが、今回はそれに加えて計算式が
セットされたセルも、消去対象から除外されている。

手動でやるなら、選択オプションで数値のみを指定した場合の範囲に限り、
消去すればよい。

f:id:Infoment:20220109175755p:plain

そこで今回は、前回の解答を再利用するとしよう。

Sub VBA_100Knock_004()
    ' 表全体を変数に格納。
    Dim TableRange As Range
    Set TableRange = Range("A1").CurrentRegion
    ' 表の領域をオフセットさせたうえで、一行一列ずつ
    ' 縮めることで指定領域を得る。
    Dim TargetRange As Range
    Set TargetRange = TableRange _
            .Resize(TableRange.Rows.Count - 1, _
                    TableRange.Columns.Count - 1) _
                        .Offset(1, 1)
        
    ' 指定領域の数値のみ消去。
        On Error Resume Next
        TargetRange.SpecialCells(xlCellTypeConstants, _
                                 xlNumbers) = vbNullString
End Sub

RangeオブジェクトのSpecialCellsメソッドは、空白セルを一括で選ぶ場合などに
とても使い出があるのでお勧め。

また、第二引数のxlNumbersは「数値」を表している。省略した場合、下表の
全てを指定したことになる。

定数 意味
xlNumbers 1 数値
xlTextValues 2 文字
xlLogical 4 論理値
xlErrors 16 エラー値

ご存じの方も多いと思うが念のため補足すると、第二引数は2のべき乗と
なっている。
f:id:Infoment:20220109174603p:plain
※オブジェクトブラウザで確認した限り、値「8」はこの場合存在しない
 ようです。

従って、有効/無効を1/0でスイッチの如く与えた場合、例えば
数値「1」と理論値「4」とエラー値「16」を有効にすると、このように
表される。
f:id:Infoment:20220109175511p:plain

以上のことから、マクロでは次のような表記が可能となる。

' 以下は全て同じ意味。
' ① 定数の足し算で指定。
TargetRange.SpecialCells(xlCellTypeConstants, _
                         xlNumbers + xlLogical + xlErrors) = vbNullString

' ② 値の足し算で指定。
TargetRange.SpecialCells(xlCellTypeConstants, _
                         1 + 4 + 16) = vbNullString

' ③ 値の合計で指定。
TargetRange.SpecialCells(xlCellTypeConstants, 21) = vbNullString

※2進数の「10101」は、10進数で「21」。
※他の組合せでは合計値が21にならないため、定数の足し算が可能。
※「マクロの記録」でコードを取得した場合は、③の表記となる。

解答を実行した結果がこちら。
f:id:Infoment:20220109181821g:plain

※冒頭リンク先の解答例および解説も、ぜひご一読ください。

参考まで。