• ベストアンサー

実行中のマクロを中止(中断)したい。

エクセル2003でマクロを勉強中です。 ユーザーフォームにボタンを二つ配置し「ボタン1」は次の命令で アクティブセルがタイマーで移動します。 この移動中(マクロの実行中)に「ボタン2」クリックで中止させる命令が可能でしょうか? Private Sub CommandButton1_Click() Dim i As Integer For i = 1 To 100 ActiveCell.Value = 1 ActiveCell.Offset(1, 0).Activate Application.Wait (Now + TimeValue("0:0:01")) Next i End Sub

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

  • ベストアンサー
  • calorieta
  • ベストアンサー率36% (8/22)
回答No.2

DoEventsを使ってみては如何でしょうか。 長い処理を行っているときに、キャンセルしたい場合などに使います。 (他にも用途はありますが) 詳しい内容はリンクを確認ください。 Dim CancelFlg As Integer Private Sub CommandButton1_Click() Dim i As Integer CancelFlg = 0 For i = 1 To 100 DoEvents ActiveCell.Value = 1 ActiveCell.Offset(1, 0).Activate Application.Wait (Now + TimeValue("0:0:01")) If CancelFlg = 1 Then Exit For Next i End Sub Private Sub CommandButton2_Click() CancelFlg = 1 End Sub

参考URL:
http://officetanaka.net/excel/vba/tips/tips23.htm
ksrnt
質問者

お礼

あっという間にこれだけのお答えを作っていただき感激です。 if then でなんとかとは思っていましたがDoEvents を知りませんでした。 ありがとうございました。

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

標準モジュールに Sub test01() For i = 1 To 1000000 Cells(1, 1) = i DoEvents If i = 200000 Then MsgBox "AA" Next i End Sub シートにコマンドボタンを1つ張り付け Private Sub CommandButton1_Click() Stop End Sub を入れる。 Test01を実行して早いうちに、ボタンをクリックすると Stopで止まったが。 これでは止まって、その後の処理は(実行ー継続をクリックという手操作なしでは)続けられないからダメでしょうね。

ksrnt
質問者

お礼

早速の回答ありがとうございます 当方、初心者で理解できない部分もありますが勉強させていただきます。

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

こんにちは。 Excel 2003 なら、以下のようにしてもとまると思います。 Wait よりも、Sleep のほうがよいです。もし、これ以上、反応を速くしたいとなると、コードを全面的に変えなくてはなりません。 '------------------------------------------- Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long) Private flg As Boolean Private Sub CommandButton1_Click() Dim i As Integer flg = False For i = 1 To 100 If flg Then Exit Sub  ActiveCell.Offset(i - 1, 0).Value = 1  DoEvents  Sleep 1000 'Application.Wait (Now + TimeValue("0:0:01")) Next i End Sub Private Sub CommandButton2_Click() flg = True End Sub

ksrnt
質問者

お礼

ありがとうございます。 今回の件についてはNo.2様の回答で解決できましたのでこの内容についてはじっくり研究させていただきます。お礼のポイントは付けられませんが、今回ポイントの付け方がわかりましたので、相当前にWendy02様にお答えいただいたものに本日ポイントを付けさせていただきました。 ふざけてるようかもしれませんがまじめなお礼の気持ちです。

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.1

Waitメソッドでは制御がWindowsに戻らないのでボタンが押せないのではないですか? Do~Loopの中でDoEventsを入れて制御をWindowsに戻す方法が一般的ではないかと思います。 参考になりそうなサンプルがありましたよ http://www.ichikura.com/excel-contents/excontent/excon3.htm

ksrnt
質問者

お礼

早速の回答ありがとうございます。 参考のサンプルもとても面白そうです。 こういうのがあること自体知らない初心者です。 じっくり楽しませてもらいます。

関連するQ&A