- 締切済み
ExcelVBA実行中にキャンセルをしたい。
ExcelVBAで報告書を作成するプログラムを作成していますが、実行ボタンをつくりクリックすると終わるまで途中でキャンセルができません。 進行状況を表示するようなメッセージボックスみたいのを表示させてキャンセルボタンをつけるのが思いつきますが、どのようにしたらできるのでしょうか?
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Wendy02
- ベストアンサー率57% (3570/6232)
私も、Ctrl +Break で言いような気がしますが、 以下は、無限ループのプロシージャで、Esc キーによって解除できます。 また、i (目的の数 - i)で進捗状況は分かるはずです。実際は、その1000倍の回数が動いています。 PC の性能によっても違いますが、API Sleep は、100以上が適当かと思います。 それ以下になると、Esc キーが認識しないことがあります。なお、API は、標準モジュールの先頭に書いてください。 Public Declare Sub Sleep Lib "KERNEL32.dll" _ (ByVal dwMilliseconds As Long) Sub InfiniteLoop() Dim i As Double Range("a1").ClearContents Application.EnableCancelKey = xlErrorHandler On Error GoTo ErrHandler Do If i Mod 1000 = 0 Then Range("a1").Value = i / 1000 DoEvents Sleep 200 End If i = i + 1 Loop loop_quit: Application.EnableCancelKey = xlInterrupt Exit Sub ErrHandler: MsgBox "ESCキーが押されました。" GoTo loop_quit End Sub
- crooked_man
- ベストアンサー率32% (9/28)
独学なので良い方法かどうかわからないのですが、 例えば、そのプログラムが For~Next文を使ってループしている場合、Forの中を実行しているあいだは、コンピュータがForの中の作業を実行することに専念してしまうので、キャンセルボタンなどを押しても、そのボタンを押したということをコンピュータが理解するのは、Forを抜けたあとになります。 そこで、DoEventsというのを入れてやるとよいです。これは、その場所で、他のイベントを優先的に実行させなさい、という命令です。 たとえば、 For i = 1 To 100000 処理 If i Mod 5000 = 0 Then DoEvents End If Next i としてやります。 Ifは、iが5000の倍数のときだけ実行するために記述します。というのも、毎回DoEventsを入れてしまうと、毎回イベントを実行するのでFor内の処理が遅くなってしまうからです。5000回に一回くらいにすれば、気にならないかもしれません。 ですから、こうすると、途中でキャンセルボタン(×印)を押した場合、iが5000の倍数になった瞬間にプログラムが終了します。(強制的な終了になってしまいますが。) おっしゃったような、進行状況を表示するフォームを作って、終了ボタンなどを貼り付けるといいかもしれないです。
- merlionXX
- ベストアンサー率48% (1930/4007)
Ctrl+Breakキーで止まりませんか?