• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Excel VBA で処理中断(DoEvents)ができなくて困ってい)

Excel VBA で処理中断ができない!?DoEventsの使い方と代替手段

このQ&Aのポイント
  • Excel VBA で処理中断(DoEvents)ができなくて困っています。Command1ボタンをクリックしても処理中断がきかず、コードの問題かDoEventsの使い方の問題か悩んでいます。代替手段があれば教えてください。
  • VB 6.0 のExcel 2002 SP3環境でDoEventsを使って処理中断を実装しようとしていますが、うまくいきません。Command1ボタンをクリックしても処理が中断されず、ループが最後まで実行されてしまいます。DoEventsの使い方に問題があるのでしょうか?また、DoEventsの代替手段があれば教えてください。
  • Excel VBA のDoEventsを使って処理中断を実装しようとしていますが、うまくいきません。Command1ボタンをクリックしても処理が中断されず、ループが最後まで実行されてしまいます。DoEventsを使った処理中断の方法や代替手段などについて教えてください。環境はExcel 2002 SP3とVB 6.0です。

質問者が選んだベストアンサー

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.1

当方xl2000ですが、提示されたコードで問題なく動作いたしました。 動作が分かり易いようにラベルを一個追加しています。 Dim fStop As Boolean Sub Sample() Dim i As Long fStop = False For i = 1 To 1000000 DoEvents Me.Label1.Caption = i If fStop = True Then MsgBox "処理が中断されました" Exit For End If Next i End Sub Private Sub CommandButton1_Click() Call Sample End Sub Private Sub CommandButton2_Click() fStop = True MsgBox "fStop=" & fStop End Sub Private Sub UserForm_Initialize() Me.Label1.Caption = 1 End Sub '○標準モジュール 'Sub test() ' UserForm1.Show 'vbModeless 'End Sub

smilytakata
質問者

お礼

みなさまご回答ありがとうございます。 結果、Trueは以下のように2箇所を書き換えることでTrueが伝わるようになりました。 `********** Dim fStop As Boolean 'グローバル変数を宣言 `********** Sub Sample() Dim i As Long fStop = False For i = 1 To 1000000 DoEvents If fStop = True Then MsgBox "処理が中断されました" Exit For End If Next i End Sub `********** stopPartsを追加(Module内に追加) Sub stopParts() fStop = True End Sub '********** Private Sub CommandButton1_Click() Call Sample End Sub '********** Call stopPartsを呼び出して、stopPartsの中でTrueをセットするように変更 Private Sub Command1_Click() Call stopParts End Sub

その他の回答 (1)

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

>(長時間の印刷中の処理中断に応用したいと思っています) プリンタ・データを、プリンタ・スプールに送ってしまうのですから、マクロは関与できません。Printer をAbortDocなどを使って制御することを考えるかもしれませんが、それでは、おおごと過ぎると思います。 だから、Wait やSleep を入れ、一枚ずつ印刷するようにし、印刷とマクロの状態を同期させます。 こちらでは、以下のコードを実際に試してはいませんから、様子をみていだくしかありません。 なお、ページを入れる場合には、PageSetup で、ページをそれぞれ付けてください。 '//標準モジュール Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long) Sub PrintPage()  Dim lngPageTotal As Long  Dim i As Long  Dim FrontPage As Integer  On Error GoTo StopLine  Application.EnableCancelKey = xlErrorHandler 'Escape で、止めます。  FrontPage = 1  lngPageTotal = Application.ExecuteExcel4Macro("GET.DOCUMENT(50)")  For i = FrontPage To lngPageTotal   'ActiveSheet.PageSetUp.CenterFooter = CStr(i) 'ページを入れる   ActiveSheet.PrintOut From:=i, To:=i, Preview:=False   Sleep 500 '←ここで調整します。500 は、0.5秒   DoEvents  Next StopLine:   MsgBox "Page" & CStr(i) & "で、印刷を中止しました。", vbInformation   Application.EnableCancelKey = xlInterrupt End Sub

関連するQ&A