プロが教える店舗&オフィスのセキュリティ対策術

よろしくお願いします。いつもgooの皆さんには大変お世話になっております
エクセルは2013です

現状
シートモジュールの Private Sub Worksheet_Calculate() に下記のマクロを書いています
条件が成立したらセルの値を繰り返し .Speech.Speak して警告するマクロです

Private Sub Worksheet_Calculate() に書いている理由は、サーバーのデータを読み込んで
いるからです

実際に条件が成立すれば、繰り返し.Speech.Speakしてくれるのですが
この繰り返しを止める方法がわかりません

今は、ESCキーで止めています
ネットで検索すると、「マクロ実行中にESCキーを押すとマクロが止まる」と書いてありますが
これはエクセル2013の仕様でしょうか滅多に止まりませんが
何かのタイミングで20回に1回ぐらいの頻度でマクロが止まってしまいます

以下は現在のマクロで、一部をわかりやすく書き換えています

For i = 1 To 10
With Application
.EnableEvents = False
.Speech.Speak Range("N40") & "ドシー オーバー"
.EnableEvents = True
End With
Next i

質問内容
For NextをESCキー以外で止める方法はありませんか?
教えてください

質問者からの補足コメント

  • hallo-2007さんこんにちは。先日もお世話になりました
    私は変数宣言の場所がまだ整理できていません

    変数宣言とSub ボタン1_Click()はどこに書いたらいいでしょうか?
    シートモジュールでしょうか?
    それとも標準モジュールでしょうか?

    No.3の回答に寄せられた補足コメントです。 補足日時:2016/03/13 16:20

A 回答 (4件)

APIでGetAsyncKeyState(1)を使った一例です。



Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Long
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub ボタン1_Click()
For i = 1 To 10
If GetAsyncKeyState(1) <> 0 Then Exit For
With Application
.EnableEvents = False
.Speech.Speak Range("N40") & "ドシー オーバー"
.EnableEvents = True
End With
Next i
End Sub

If GetAsyncKeyState(1) <> 0 Then Exit For
で マウスをクリックしたら Exit します。
詳しくは
GetAsyncKeyState(1)で検索してみてください。
この回答への補足あり
    • good
    • 0
この回答へのお礼

ありがとうございます。
見事にマウスクリックでFOR NEXTが止まるようになりました
マクロを次のように書き換えました

For i = 1 To 10
If GetAsyncKeyState(1) <> 0 Then Exit For  '追加
With Application
.EnableEvents = False
.Speech.Speak Range("N40") & "ドシー オーバー"
.EnableEvents = True
End With
Next i

以下を標準モジュールで宣言しました
Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Long
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

お陰様で長い間の疑問が解けました
助かりました
ありがとうございました

お礼日時:2016/03/13 16:58

ちょっと訂正いたします。


>変数宣言とSub ボタン1_Click()はどこに書いたらいいでしょうか?
>シートモジュールでしょうか?
>それとも標準モジュールでしょうか?
標準モジュールに書きますが
Declare Function GetAsyncKeyState Lib "User32.dll" (ByVal vKey As Long) As Long
だけで十分です。

Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
は余計な部分をコピーしてしまいました。
    • good
    • 0
この回答へのお礼

修正ありがとうございます
GetAsyncKeyState ネットで勉強しました
ありがとうございました

お礼日時:2016/03/14 02:34

Exit Forはどうですか?

    • good
    • 0
この回答へのお礼

nao0620さん、こんにちは
Exit Forを初めて知りました
やってみます

お礼日時:2016/03/13 16:12

止める処理を書けばいいのでは?


どのような条件になったら止めるのかわかりませんが、if判定後、exit forで抜けられます。
ブロしージャー全体から抜けたいのであれば、exit sub。
手動で止めたいという意図の質問であれば無視してください
    • good
    • 0
この回答へのお礼

Hypnomaticさんこんにちは
早速教えていただきましてありがとうございます
Hypnomaticさんには前にもお世話になっております

exit forを初めて知りました

「if判定後、exit forで抜けられます。」ということは
止めたい時にどこかのセルに何かを入力して、それをIFで判断すればいいですね
やってみます

お礼日時:2016/03/13 16:10

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