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も見ています
-
それもChatGPT!?と驚いた使用方法を教えてください
仕事やプライベートでも利用が浸透してきたChatGPTですが、こんなときに使うの!!?とびっくりしたり、これは画期的な有効活用だ!とうなった事例があれば教えてください!
-
人生最悪の忘れ物
今までの人生での「最悪の忘れ物」を教えてください。 私の「最悪の忘れ物」は「財布」です。
-
モテ期を経験した方いらっしゃいますか?
一生に一度はモテ期があるといいますが、みなさんどうですか? いまがそう! という方も、「思い返せばこの頃だったなぁ」という方も、よかったら教えて下さい。
-
【選手権お題その3】この画像で一言【大喜利】
とあるワンシーンを切り取った画像。この画像で一言、お願いします!
-
【選手権お題その2】この漫画の2コマ目を考えてください
サッカーのワンシーンを切り取った1コマ目。果たして2コマ目にはどんな展開になるのか教えてください。
-
DoEventsがやはり分からない
Visual Basic(VBA)
-
DoEventsが必要な理由について
Visual Basic(VBA)
-
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
-
4
ExcelVBAのDoEventsによるエラー?
Visual Basic(VBA)
-
5
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
6
エクセルVBAが途中で止まります
Visual Basic(VBA)
-
7
DoEvents関数って何?
Visual Basic(VBA)
-
8
vba クリップボードクリアについて教えてください
その他(プログラミング・Web制作)
-
9
On ErrorでエラーNoが0
Visual Basic(VBA)
-
10
VB6 DoEventsの代わりは?
Visual Basic(VBA)
-
11
VBAで保存しないで閉じると空のBookが残る
Excel(エクセル)
-
12
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
13
エクセルVBAのフォームを最前面にする方法を教えてください。
Visual Basic(VBA)
-
14
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
15
VBA シートのボタン名を変更したい
Visual Basic(VBA)
-
16
VBA(エクセル)のユーザーフォームの固定
Visual Basic(VBA)
-
17
エクセルのVBA 特定のセルでエンターキーでマクロ実行
Excel(エクセル)
-
18
Chr(13)とChr(10)の違いは?
PowerPoint(パワーポイント)
-
19
エクセルVBA、ステップモードと結果が異なる
その他(Microsoft Office)
-
20
vba 時間の引き算 例えば 15:00から16:15の間の時間は1時間15分ですが、vbaのコード
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
メッセージボックスのボタン名変更
-
VBA kernel32 の意味
-
ACCESS側からEXCELの書式を設定...
-
マウスのクリックを無視したい
-
OSシャットダウン時の常駐アプ...
-
VBSの処理中一旦処理を止めて再...
-
VBスクリプトで「お待ち下さい...
-
【KeyDown】キーコードについて
-
ASP VBScriptでスクリプト実行...
-
スロットゲームのプログラミング
-
VBA メッセージボックスを自動...
-
DoEvents
-
結果待ちの関数を強制終了
-
サスペンド(休止やスタンバイ...
-
マルチスレッドを実現したい
-
ASP.NETでのメッセージ画面を出...
-
Excel VBA 自動的に閉じるMsgBox
-
手動かプログラムでの起動かの判断
-
MFCのワーカースレッドとUIスレ...
-
MFCのメニューバーのイベント取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBSの処理中一旦処理を止めて再...
-
ACCESS側からEXCELの書式を設定...
-
メッセージボックスのボタン名変更
-
VBA kernel32 の意味
-
Application.ScreenUpdating=Fa...
-
VBA、UserFormを前面に出力して...
-
VBSで応答不要のメッセージボッ...
-
VBA メッセージボックスを自動...
-
Excel VBA で処理中断(DoEvents...
-
「キャンセル」ボタン付きの処...
-
PostMessageの連続送信
-
エクセルVBAでクリップボード内...
-
Excel VBA 実行中に一瞬フリー...
-
【C#】 あるイベントから別イ...
-
MFCのワーカースレッドとUIスレ...
-
VB6でフォームをリロードしたい
-
【MFC】イベントの無効化について
-
Excelのワークシートに行を挿入...
-
ボタンが押された事を検知する...
-
VCでウエイトをミリ秒でかけ...
おすすめ情報