
現在業務で以下のようなマクロを記述しています。
(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キーが連続で押された場合も正常にキャンセル処理を走らせるには、どのようにしたら実現できますでしょうか?よろしくお願い致します。
No.2ベストアンサー
- 回答日時:
こんにちは。
まず、アプリケーションは、書かれていませんが、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
というようなスタイルにしますね。
ご丁寧なご回答ありがとうございます。
結論から申しますと、今回のインターラプトさせる実装は不要となりました。
大変的確なアドバイスを頂きながら誠に申し訳ございません。今後の参考とさせて頂きます。
この度はありがとうございました。
No.1
- 回答日時:
> OUTPUT_ERROR:
で何の処理をしてるのか?
エラー処理自体が時間を要するなら、escキー押下でフラグ設定するだけにして
処理本体でフラグ判定して、処理分岐させるとか
この回答への補足
ご回答ありがとうございます。
OUTPUT_ERROR:
では、Err.Numberを返り値として詰めるとか、
Application.Cursor = xlDefault としてマウスポインタを標準ポインタに戻すというような初期設定に戻す処理を行っているのみです。
そうですね、Escキーでエラーをキャッチするのではない実装は1つの手ですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
VBAでCOPYを繰り返すと、処理が...
-
EXCEL VBA マクロ 実行する度に...
-
UMLでの例外処理
-
セックスレスの既婚女性は自慰...
-
メルカリのメルカードで買い物...
-
月度は何て読みますか?
-
switch の範囲指定
-
VBAでループ内で使う変数名を可...
-
【Excel】特定の文字を含むセル...
-
お家デートをしててハグを長い...
-
findは動くがfindnextがマクロ...
-
waitせずにキー入力があった場...
-
変数が""(空文字)かどうか判別...
-
ビープ音を連続して鳴らす
-
VBの質問#if 0 then ってどう...
-
ボタンクリックイベント 重複...
-
RPGプログラムの*HIVALについて
-
Do~Loopした回数をカウントしたい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
【Excel】特定の文字を含むセル...
-
switch の範囲指定
-
VBAでループ内で使う変数名を可...
-
EXCEL VBA マクロ 実行する度に...
-
UMLでの例外処理
-
銀行の窓口処理の件で知ってる...
-
VBAでCOPYを繰り返すと、処理が...
-
月度は何て読みますか?
-
インタラクティブの反対語は?
-
VB.NET DataGridViewでIsNewRo...
-
DoEventsがやはり分からない
-
VBの質問#if 0 then ってどう...
-
お家デートをしててハグを長い...
-
セックスレスの既婚女性は自慰...
-
VB.NET Excelを読み込んでDataT...
-
リョウ・・・量?料?
-
メルカリのメルカードで買い物...
-
Loadイベント中にほかのイベン...
おすすめ情報