[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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
また、全体の提示がないのでわかりませんけど、
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.