プロが教える店舗&オフィスのセキュリティ対策術

現在業務で以下のようなマクロを記述しています。
(Xはダミー文字です)

Function XXX()

(略)

On Error GoTo OUTPUT_ERROR

Application.EnableCancelKey = xlErrorHandler

(略)

'別ブックからの値貼り付けコピー
XXX.Value = XXX.Value

(略)

OUTPUT_ERROR:

XXXXXXXXXXX


(略)

End Function


この処理において、Valueを用いた値の貼り付けが膨大なデータを対象としており長時間処理がかかる場合、その貼り付け処理中にEscキーを1回押下した時は、エラートラップが正常に働き、値の貼り付けの途中で終了しているようなのですが、同じ状況でEscキーを連続で押下し続けた場合、2回目の押下以降で「実行時エラー '18':」という表記のウィンドウが表示され処理が止まってしまいます。


上記ウィンドウにてデバッグボタンを押下すると、「OUTPUT_ERROR」の最初の行(XXXXXXXXXX
)で止まっています。


尚、同じ処理をValueではなくCopyにて実装したところ、Escキー連続押下しても、Copy処理が完了するまで割込み処理が走っていないようで、Copy終了後に「OUTPUT_ERROR:」以降の処理が走っているようでした。ただ、Valueよりも処理時間が格段に長くなってしまうため、こちらの案は出来る限り採用しない方向で検討しています。


実現したいことは、処理時間の短縮の為、Valueにて値を貼り付けコピーを実施しつつも、それが長時間に渡る場合はEscキー押下でキャンセル処理を実装することなのですが、Escキーを連続押下された場合も考慮して動作確認をしたところ、上記の現象が出てしまっており、解決の糸口が見つかっていません。

この場合、Escキーが連続で押された場合も正常にキャンセル処理を走らせるには、どのようにしたら実現できますでしょうか?よろしくお願い致します。

A 回答 (2件)

> OUTPUT_ERROR:


で何の処理をしてるのか?

エラー処理自体が時間を要するなら、escキー押下でフラグ設定するだけにして
処理本体でフラグ判定して、処理分岐させるとか

この回答への補足

ご回答ありがとうございます。


OUTPUT_ERROR:

では、Err.Numberを返り値として詰めるとか、
Application.Cursor = xlDefault としてマウスポインタを標準ポインタに戻すというような初期設定に戻す処理を行っているのみです。

そうですね、Escキーでエラーをキャッチするのではない実装は1つの手ですね。

補足日時:2014/06/25 22:23
    • good
    • 0

こんにちは。



まず、アプリケーションは、書かれていませんが、Excelということでしょうか?

ふつうは、.Value = .Value で、そのようなインターラプトさせるコードにはしないものですし、Excelでなぜ、Function プロシージャなのか、よく分かりません。つまり、他のマクロから呼び出ししているということでしょうか?

基本的に

Application.EnableCancelKey = xlErrorHandler
と入れるなら、
Application.EnableCancelKey = xlInterrupt
と戻さなくてもよいのかな?(場合によるようですが)

それから、大量ということは、ループしているのでしょうか?
もし、そうでしたら、DoEventsで割り込みさせたほうが無難だと思います。

EnableCancelKey を使う時は、処理条件が相手任せで、無限ループになる可能性がある場合などに施すのであって、注意して使うことが要求されます。これを使う場合は、イレギュラーなコードの方が多いです。質問内容では、隠れている所がよく分からないです。

そもそも、値コピーに時間が掛かるという部分に、解決の要素がないのか、現在の質問の中では分かりません。量的な問題の場合は、カウンターをつけて、1万回とか10万回とかループした時に、カウンターが回数を越えたということで、途中で止まるように作ります。また、別に、フラグで割り込みを入れるようにも作ります。

> OUTPUT_ERROR:
については、問題はありませんが、
通常は、

OUTPUT_ERROR:
If Err.Number = 18 Then
  MsgBox "途中終了します。"
  '別の処理があるなら、ここに入れます。
End If
'Application.EnableCancelKey = xlInterrupt

というようなスタイルにしますね。
    • good
    • 0
この回答へのお礼

ご丁寧なご回答ありがとうございます。

結論から申しますと、今回のインターラプトさせる実装は不要となりました。
大変的確なアドバイスを頂きながら誠に申し訳ございません。今後の参考とさせて頂きます。


この度はありがとうございました。

お礼日時:2014/06/26 19:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!