
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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) VBA ステータスバー DoEvents 1 2023/03/30 12:22
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Excel(エクセル) エクセルシート中の全角英数字を半角に変換したい 4 2022/07/07 13:14
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
このQ&Aを見た人はこんなQ&Aも見ています
-
DoEventsがやはり分からない
Visual Basic(VBA)
-
DoEventsが必要な理由について
Visual Basic(VBA)
-
ExcelVBAのDoEventsによるエラー?
Visual Basic(VBA)
-
-
4
エクセルVBAが途中で止まります
Visual Basic(VBA)
-
5
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
6
vba クリップボードクリアについて教えてください
その他(プログラミング・Web制作)
-
7
文字列からタブコードを取り除きたい
Visual Basic(VBA)
-
8
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
9
Escキーを押すと、中断する時としない時がある
Visual Basic(VBA)
-
10
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
11
エラーになってないのにVBAが中断される
Excel(エクセル)
-
12
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
13
Excel VBA あるセルでENTERを押すと特定のセルへ移動したい
Excel(エクセル)
-
14
エクセルでエラーが出て困っています。
Excel(エクセル)
-
15
エクセルVBAで5行目からオートフィルタモードに設定したいたい
Excel(エクセル)
-
16
VBAでの一時停止と再開の方法
その他(プログラミング・Web制作)
-
17
VBA シートをコピーする際に Copyメソッドは失敗しましたのエラーが出てしまいます
Visual Basic(VBA)
-
18
サクラエディタは複数行に渡る文字列の正規表現検索はできますでしょうか?
フリーソフト
-
19
エクセルのVBA 特定のセルでエンターキーでマクロ実行
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
メッセージボックスのボタン名変更
-
ACCESS側からEXCELの書式を設定...
-
VBA、UserFormを前面に出力して...
-
VBA メッセージボックスを自動...
-
MFCのメニューバーのイベント取得
-
VBSの処理中一旦処理を止めて再...
-
VB.NET開発(イベントプロシー...
-
エクセルVBAでクリップボード内...
-
「VBでExcel上PictureBoxダブル...
-
VBSで応答不要のメッセージボッ...
-
Application.ScreenUpdating=Fa...
-
C言語で計算機をつくりたい
-
Timerのカウントダウンのしかた...
-
スロットゲームのプログラミング
-
キーボード入力、マウス操作を...
-
VB6 コマンドボタン クリック...
-
[VC++] AfxBeginThreadで生成し...
-
VB Loopを一時停止し再開あるい...
-
サスペンド(休止やスタンバイ...
-
VCでウエイトをミリ秒でかけ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBSの処理中一旦処理を止めて再...
-
メッセージボックスのボタン名変更
-
VBA kernel32 の意味
-
ACCESS側からEXCELの書式を設定...
-
Application.ScreenUpdating=Fa...
-
Excel VBA で処理中断(DoEvents...
-
エクセルVBAでクリップボード内...
-
VBSで応答不要のメッセージボッ...
-
VBA、UserFormを前面に出力して...
-
【C#】 あるイベントから別イ...
-
【MFC】イベントの無効化について
-
「キャンセル」ボタン付きの処...
-
シャットダウン時のExcel強制終...
-
MFCのワーカースレッドとUIスレ...
-
Excel VBA 実行中に一瞬フリー...
-
Excel(VBA)シート上のコマンド...
-
VB.NETで数秒間msgboxの...
-
サスペンド(休止やスタンバイ...
-
ループを使わずに、特定時間に...
-
起動後直に実行するコードはど...
おすすめ情報