プロが教えるわが家の防犯対策術!

エクセル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

A 回答 (4件)

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/01/24 16:55

標準モジュールに


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で止まったが。
これでは止まって、その後の処理は(実行ー継続をクリックという手操作なしでは)続けられないからダメでしょうね。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/01/24 23:00

こんにちは。



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
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/01/24 22:58

Waitメソッドでは制御がWindowsに戻らないのでボタンが押せないのではないですか?


Do~Loopの中でDoEventsを入れて制御をWindowsに戻す方法が一般的ではないかと思います。

参考になりそうなサンプルがありましたよ
http://www.ichikura.com/excel-contents/excontent …
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/01/24 16:49

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!