マクロでIFERRORを使ってみる(失敗談)

例えば、こんな値が並んでいるとする。
f:id:Infoment:20190623220752p:plain

数字の各値に10を加えて右隣に表示したいのだが、数字以外の値に10を加えれば、エラーになってしまう。
f:id:Infoment:20190623221038p:plain

こんな時は、IFERROR関数を用いると便利だ。
support.office.com

平たく言うと、「エラーだったら、何表示します?」って関数だ。
例えば今回、「10を加えてエラーだったら、元の数字を表示する」のような使い方が出来る。
f:id:Infoment:20190623221424p:plain

では、これをマクロで使用することはできるのだろうか。先程の内容をマクロで再現してみた。

Sub test()
    Dim r As Range
        For Each r In Selection
            r.Offset(, 1).Value = WorksheetFunction.IfError(r.Value + 10, r.Value)
        Next
End Sub

結果は失敗。「型が違う」と怒られてしまった。
f:id:Infoment:20190623222200p:plain

IFERRORで評価する前に、VBAがエラーを拾ってしまうということだろうか。
もしマクロで再現するとしたら、一旦エラーを無視して処理を実行し、エラーだった場合は処理前の値をセットするなどが考えられる。

Sub test()
    Dim r As Range
    Dim Result As Variant
        For Each r In Selection
            On Error Resume Next
            Result = r.Value + 10
            Select Case Err.Number
                Case 0
                    r.Offset(, 1) = Result
                Case Else
                    r.Offset(, 1) = r.Value
            End Select
            On Error GoTo 0
        Next
End Sub

もっともこの場合に限って言えば、先に数値か否かを評価する方がスマートかも。

Sub test()
    Dim r As Range
        For Each r In Selection
            If IsNumeric(r.Value) Then
                r.Offset(, 1) = r + 10
            Else
                r.Offset(, 1) = r
            End If
        Next
End Sub

未だ、道半ば。もう少し検討したうえで、昨日の内容と合流する予定です。

参考まで。