
Excel VBA で処理中断(DoEvents)ができなくて困っています。
まず、CommandButton1ボタンでSampleをコールし、Sample処理の中でループを廻し、途中でCommand1ボタンをクリックして、処理中断(DoEventsによって)をいれたいと思っています。
しかし、Command1ボタンをクリックしても処理中断がきかないのです。
グローバル変数fStopにはCommand1ボタンをクリックしたときにTrueが入っていることは、MsgBoxで確認していますが、Sample処理の方に値がつたわっていないようで、ループが最後まで止まりません。
コードが悪いのでしょうか、それとも、DoEventsの使い方が悪いのでしょうか。
もし、DoEventsが使えないのであれば、代替手段はありますでしょうか。
(長時間の印刷中の処理中断に応用したいと思っています)
環境はExcel 2002 SP3 , VB 6.0 , Windows XPです。
なお、DoEventsのコードは以下のURLを参考にして作成しました。
http://officetanaka.net/excel/vba/function/DoEve …
コードは以下のとおりです。
'*********
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
'********
Private Sub CommandButton1_Click()
Call Sample
End Sub
'********
Private Sub Command1_Click()
fStop = True
MsgBox "fStop=" & fStop
End Sub
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
みなさまご回答ありがとうございます。
結果、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
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が見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
DoEventsがやはり分からない
Visual Basic(VBA)
-
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
DoEventsが必要な理由について
Visual Basic(VBA)
-
-
4
ExcelVBAのDoEventsによるエラー?
Visual Basic(VBA)
-
5
Escキーを押すと、中断する時としない時がある
Visual Basic(VBA)
-
6
エクセルVBAが途中で止まります
Visual Basic(VBA)
-
7
vba クリップボードクリアについて教えてください
その他(プログラミング・Web制作)
-
8
Excel VBAで、ユーザーフォームをモードレス表示している間、処理を止めるには?
Visual Basic(VBA)
-
9
文字列からタブコードを取り除きたい
Visual Basic(VBA)
-
10
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
11
マクロで、次のコードへ行く前に時間をおくにはどうしたらいいのでしょうか?
その他(Microsoft Office)
-
12
サクラエディタは複数行に渡る文字列の正規表現検索はできますでしょうか?
フリーソフト
-
13
VBA コードを実行すると画面が真っ白になる
Visual Basic(VBA)
-
14
Excel vbaについての質問
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBSの処理中一旦処理を止めて再...
-
VBA、UserFormを前面に出力して...
-
ASP.NETでのメッセージ画面を出...
-
VBSで応答不要のメッセージボッ...
-
Stack around the variable 'xx...
-
VBA メッセージボックスを自動...
-
VBA kernel32 の意味
-
MFCのワーカースレッドとUIスレ...
-
ACCESS側からEXCELの書式を設定...
-
【MFC】イベントの無効化について
-
「キャンセル」ボタン付きの処...
-
access 確認メッセージのはい/...
-
【C#】 あるイベントから別イ...
-
MFCのView終了時の終了確認
-
Application.ScreenUpdating=Fa...
-
キーボード入力、マウス操作を...
-
thunderbirdのメッセージフィル...
-
Macターミナルで実行中のプログ...
-
C# シリアル通信でデータ受信...
-
バックグラウンドのプロセスの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBSの処理中一旦処理を止めて再...
-
VBA kernel32 の意味
-
メッセージボックスのボタン名変更
-
ACCESS側からEXCELの書式を設定...
-
VBSで応答不要のメッセージボッ...
-
VBA、UserFormを前面に出力して...
-
【C#】 あるイベントから別イ...
-
Excel VBA で処理中断(DoEvents...
-
PostMessageの連続送信
-
ボタンが押された事を検知する...
-
Application.ScreenUpdating=Fa...
-
エクセルVBAでクリップボード内...
-
VB Loopを一時停止し再開あるい...
-
起動後直に実行するコードはど...
-
DirectX環境下での方向キー同時...
-
Excel VBA 実行中に一瞬フリー...
-
OSシャットダウン時の常駐アプ...
-
マウスのクリックを無視したい
-
エクセルVBAで
-
メッセージボックスの表示につ...
おすすめ情報