- 締切済み
モードレスボタンを押す事により処理を中断する。
初めまして、以下のVBAを組みました。メインプロシージャは以下の通りです。処理時間が長いので、途中でボタンを押す事により、中断したいと思っております。しかし、ボタンおしても止まりません。何卒ご教授の程宜しくお願い申し上げます。 c = 0 g = 0 UserForm.Show vbModeless UserForm.Repaint flag = False For y = kk To ll For x = ii To jj If ws1.Cells(y, x).Value = ws2.Cells(y, x).Value Then Else g = g + 1 c = c + 1 ws2.Cells(y, x).Interior.ColorIndex = 3 ws3.Cells(g, "A") = Cells(y, x).Address(RowAbsolute:=False, ColumnAbsolute:=False) End If DoEvents If flag Then Exit For Next x If flag = True Then GoTo ErrorHandler: Next y flag = False Unload UserForm Exit Sub ErrorHandler: flag = False Unload UserForm MsgBox "エラーで終了しました。" End Sub ユーザーフォームは以下の通りです。 Private Sub CommandButton1_Click() flag = True End Sub 当然flagはメインプロシージャの前に定義しております。 以上、宜しくお願い申し上げます。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- 19560816
- ベストアンサー率0% (0/0)
投稿者です。皆さんコメントどうも有難う御座います。一点違いが判りました。No.1さんの答え通りしました。その結果、投稿者のは、アクテイブシートにABooKとBBookの比較で、違いのあるセル番地を追加したSeetに書きながら、フレームボタンを表示していました。フラグの使い方は、何度も点検しました。No.1さんのは、アクティブシートにフレームボタンを表示していましたが、時間のかかる処理は、表示されているシートではありませんでした。デバッグはブレイクポイントも使いました。二つのBookでsheetのセルの比較を行い、違いのあるセルを追加したSeetのセルに違いのあるセル番地を書き込む事で、追加したSeetにフレームボタンを書いていました。 【◎◎の入力で△△の条件の場合☆☆の出力結果を出したい】との表現が難しく、大変すみませんでした。投稿者のは、追加したSeetに違いのあるセル番地を見せながら、フレームボタンを表示させて、あまりにも時間のかかる時に処理を止めたいと言うのが趣旨でした。ほんとううに皆さん有難う御座います。この表現で、お判りになる方は、どうか助けて下さい。ほんとに困っております。
- 19560816
- ベストアンサー率0% (0/0)
本当に有難うございます。今一度確かめてみます。今後とも宜しくお願い申し上げます。
- junonboys2077
- ベストアンサー率50% (5/10)
こんにちわ♪ No.1さんの模範回答だと期待通りの反応をして、オリジナルではNGなんですね。。。 ところで、質問者さんは、添付画像のようにVBエディタのデバッグ機能とか使ってますか? コードを記述している左のグレー部分をクリックすると茶色のブレークポイントが付いて実行時に一時停止しますが。 そのとき、確認したい変数の上にカーソルを持っていくと変数の内容がチップメッセージ(っていうのか?)で状態が表示されます。 また、ブレークしたところからF8キーを押すごとにステップ実行、F5キーで継続実行します。 私もNo.1の回答をテストしてみて、模範回答はOK、オリジナルはNGといことは、直感的にflag変数の宣言方法が間違っているのではと思いました。 試しに先頭の宣言をPublicからDimに変えてテストしてみたら同様にコマンドボタンに反応しなくなりました。 'Public Flag As Boolean Dim Flag As Boolean このサイトでの質問のコツは、 ◎◎の入力で△△の条件の場合☆☆の出力結果を出したい とかいう質問ですと、VBAの達人の方々がそれぞれの考え方で模範回答を示してくれるんですが、今回の場合、デバッグレベルなので回答が付かないんですよね。 No.1さんは、わざわざ不足したコードを付け足してテストして回答してるので親切な方だと思いますょ。 それでは、頑張ってください。
- jojo_dio
- ベストアンサー率41% (24/58)
おはようございます。 先頭の宣言が抜けていたので適当に書き足してテストしてみましたが、フォームのコマンドボタン押したら、Flagがtrueになってループは抜けました。 下記記述は、標準モジュールに記述しました。 Flagの宣言が何か誤ってるのでは!? Public Flag As Boolean Sub ABC() c = 0 g = 0 UserForm1.Show vbModeless UserForm1.Repaint Flag = False Dim ws1 As Worksheet Dim ws2 As Worksheet Dim ws3 As Worksheet Set ws1 = ThisWorkbook.Sheets("Sheet1") Set ws2 = ThisWorkbook.Sheets("Sheet2") Set ws3 = ThisWorkbook.Sheets("Sheet3") kk = 1 ll = 1000 ii = 1 jj = 200 For y = kk To ll For x = ii To jj If ws1.Cells(y, x).Value = ws2.Cells(y, x).Value Then Else g = g + 1 c = c + 1 ws2.Cells(y, x).Interior.ColorIndex = 3 ws3.Cells(g, "A") = Cells(y, x).Address(RowAbsolute:=False, ColumnAbsolute:=False) End If DoEvents If Flag Then Exit For End If Next x If Flag = True Then GoTo ErrorHandler: Next y MsgBox "全LOOP処理終了" Flag = False Unload UserForm1 Exit Sub ErrorHandler: Flag = False Unload UserForm1 MsgBox "エラーで終了しました。" End Sub
補足
ご教授頂いた、マクロを実際に実行すると、思った通り動作します。しかし、自分のマクロに展開しても、UserForm1のCommandButton1が動作しません。【Flagの宣言が何か誤ってるのでは】ご指摘通り見直しました。やはり、だめです。どなたか、お分かりになる方、助けて下さい。宜しくお願い致します。