[[20181220102510]] 『InputBoxでキャンセルを押したときの処理』(ニンジン) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『InputBoxでキャンセルを押したときの処理』(ニンジン)

InputBoxでキャンセルを押したとき、
シートAの(10,6)〜(16,6)のセルの値を消したいのですが、
値が残ったまま次の処理が行われます。
書き方が悪いのでしょうか?

下記マクロ、一部抜粋です。

Worksheets(i).Select
On Error Resume Next
Set rng0 = Application.InputBox(Prompt:="セルを選択してください", Type:=8)

        If UCase$(rng0) = "FALSE" Then
          MsgBox "次のシートに移動します"
          Sheets("A").Range(Cells(10, 6), Cells(16, 6)).ClearContents
          GoTo skip0
        End If

メッセージボックスは表示され、
skip0まで処理がとび、残りの処理も滞りなく処理されます。

シートAのセル削除だけが無視されている状態です。
(なお、InputBoxが起動するのは別のシートを開いているときです)

アドバイス頂けると嬉しいです。

< 使用 Excel:unknown、使用 OS:unknown >


 >Sheets("A").Range(Cells(10, 6), Cells(16, 6)).ClearContents
 ここでエラーが出ているがOn Error Resume Nextのために無視されている。
 デバッグ時にはOn Error Resume Nextを無効にして試すといい。

(ねむねむ) 2018/12/20(木) 11:08


 エラーの原因はCells(10, 6)、Cells(16, 6)で親のシートが指定されていないためその時アクティブなシートのセルとみなされて
 Sheets("A").Rangeと矛盾しているため。
 範囲が固定であれば
 Sheets("A").Range("F10:F16").ClearContents
 でもいいのでは?

(ねむねむ) 2018/12/20(木) 11:12


 元の形で行く場合は
 Sheets("A").Range(Sheets("A").Cells(10, 6), Sheets("A").Cells(16, 6)).ClearContents
 または
 With Sheets("A")
     .Range(.Cells(10, 6), .Cells(16, 6)).ClearContents 
 End With
 で。
(ねむねむ) 2018/12/20(木) 11:17

ねむねむさん、ご指摘ありがとうございます。
そこだけ無視されて処理が継続する理由、エラーがでる理由ともに納得しました。

ただ、エラー処理が苦手で、もし良ければ後学のためにデバッグ時にOn Error Resume Nextを無効にする方法を教えて頂けると助かります。
(とりあえず、単純にOn Error Resume Nextを削除しただけではキャンセルを押した時点から中断されるというのは分かりましたが…)

削除したいセルは本当は固定ではないので、Cellsの形でも記載して下さって助かりました。
(後半のコードを見てやっと、ご指摘が理解できたので。)
素早く的確な回答、本当にありがとうございます。
(ニンジン) 2018/12/20(木) 11:55


 VBエディタのツール-オプションで全般-エラートラップのエラー発生時に中断を選んでみてくれ。
 On Errorがあってもエラーで停止するようになる。
 デバッグが終わったら忘れずに元に戻しておいてくれ。
(ねむねむ) 2018/12/20(木) 12:01

>削除したいセルは本当は固定ではないので、Cellsの形でも記載
横から余計な御世話かもしれませんが、注目すべきは「With」のほうです。
【Withステートメント】
http://officetanaka.net/excel/vba/beginner/16.htm
http://kabu-macro.com/vba_apply/vba_with.html

また、全体の提示がないのでわかりませんけど、

 Worksheets(i).Select

↑は不用である可能性が高いです。

このほか、

 On Error Resume Next

としていますが、今回のように想定されてないエラーが発生しても、お構いなしに進むようになりますから、限定的にするべきです。
今回は、キャンセルボタンを押されたときに、返り値がFalseになってしまい、rng0にセットできないことの対策でしょうから、

    Sub test()
        Dim rng0 As Range

        On Error Resume Next
        Set rng0 = Application.InputBox(Prompt:="セルを選択してください", Type:=8)
        On Error GoTo 0

        'キャンセルボタンを押されたら「rng0」がセットされずNothigのままであることを条件に分岐
        If rng0 Is Nothing Then
            With Sheets("A")
                .Range(.Cells(10, 6), .Cells(16, 6)).ClearContents
            End With
        Else
            rng0.ClearContents
        End If

    End Sub

↑のように、エラーが発生することが想定される部分だけに限定してエラー回避をすればよいはずです。

(もこな2) 2018/12/20(木) 12:38


ねむねむさん、ありがとうございます。
後ほど試させて頂きます。

もこな2さん、スッキリとまとめて頂いてありがとうございます。
リンク先も拝見しましたが、読みやすかったです。
おかげさまで、何となく使っていたWithステートメントについて理解できました。

お二人のおかげでエラー処理の仕方も少し分かった気がします。
どうもありがとうございました。
(ニンジン) 2018/12/20(木) 13:23


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.