• 締切済み

ExcelVBA実行中にキャンセルをしたい。

 ExcelVBAで報告書を作成するプログラムを作成していますが、実行ボタンをつくりクリックすると終わるまで途中でキャンセルができません。  進行状況を表示するようなメッセージボックスみたいのを表示させてキャンセルボタンをつけるのが思いつきますが、どのようにしたらできるのでしょうか?

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

私も、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

回答No.2

独学なので良い方法かどうかわからないのですが、 例えば、そのプログラムが 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)
回答No.1

Ctrl+Breakキーで止まりませんか?

関連するQ&A