現在業務で以下のようなマクロを記述しています。
(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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- Visual Basic(VBA) VBAコードを張り付け後のエクセルの進め方 2 2023/02/07 18:24
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) 特定の文字を含むシートだけマクロ処理をしたい 1 2023/05/22 01:43
- Excel(エクセル) マクロで謎の現象が起きていて困ってます。 エクセルで作ったボタンを押すとマクロが動いて処理をしてくれ 3 2023/06/22 17:28
- Visual Basic(VBA) 他のシートからコピーする下記マクロで貼付け位置をWorksheets(1).Range("A3")の 8 2023/01/30 18:48
- Visual Basic(VBA) 【VBA】For文を使用し、行をコピーして別シートに貼り付ける方法を教えてください。 4 2022/07/19 09:01
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで、日付を入力すると...
-
「ご処理進めて頂きますようお...
-
DoEventsがやはり分からない
-
EXCEL VBA マクロ 実行する度に...
-
VBAでループ内で使う変数名を可...
-
メルカリのメルカードで買い物...
-
Access チェックボックスでチェ...
-
【Excel】特定の文字を含むセル...
-
リョウ・・・量?料?
-
NULLを含むフィールド値の条件分岐
-
findは動くがfindnextがマクロ...
-
C言語 b += a ? 1 : 0; の意味
-
インタラクティブの反対語は?
-
Do~Loopした回数をカウントしたい
-
IQテストの数列
-
UMLでの例外処理
-
Select Case文でこのようなこと...
-
読み方教えてください。
-
2重のDo~Loopは?
-
VBAでIEを強制終了させる方法が...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「ご処理進めて頂きますようお...
-
エクセルで、日付を入力すると...
-
VBAでループ内で使う変数名を可...
-
switch の範囲指定
-
メルカリのメルカードで買い物...
-
【Excel】特定の文字を含むセル...
-
DoEventsがやはり分からない
-
EXCEL VBA マクロ 実行する度に...
-
VBの質問#if 0 then ってどう...
-
Do~Loopした回数をカウントしたい
-
もしかして
-
UMLでの例外処理
-
findは動くがfindnextがマクロ...
-
インタラクティブの反対語は?
-
VBA SaveChanges 上書きされない
-
リョウ・・・量?料?
-
Loadイベント中にほかのイベン...
-
セルの値が0はクリアするマクロ
-
FFTの結果ついて
-
Select Case文でこのようなこと...
おすすめ情報