• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:実行中のマクロを中断したい)

Excelマクロの実行中断方法とは?

このQ&Aのポイント
  • Excelマクロの実行中に中断する方法を教えてください。
  • Range("A1:B10")を読み上げる途中でマクロを中断する方法を教えてください。
  • Excel2003でDoEventsやMe.Repaint、Sleepなどを使用してもマクロの中断がうまくいかないです。解決策を教えてください。

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

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

こんにちは。 >MySpeakが見当たりません」というエラーになってしまい そのコントロールによって、こういうのは置き場所が変わりますので、ややこしいです。一般的には、そのコードは、標準モジュールに書くものですが、前回の場合は、ローカルモジュールに入れるように出来ていますが、UserForm モジュール用にはなっていません。UserForm 用には、以下のようにしてください。 '--------------------------- 'UserForm モジュール(修正) '---------------------------- Private Sub CommandButton1_Click()   Dim c As Variant   CancelFlg = False   myTime = Now()   Cnt = 1   Call MySpeak   Range("A1").Select End Sub Private Sub CommandButton2_Click()  CancelFlg = True  myValue = "" End Sub '------------------------------------ '標準モジュール '------------------------------------ Public CancelFlg As Boolean Public myTime As Date Public myValue As String Public Cnt As Integer Sub MySpeak()      With Range("A1:B10")      .Cells(Cnt).Select      myValue = .Cells(Cnt).Value    End With    If CancelFlg Or myValue = "" Then      On Error Resume Next       Application.OnTime myTime, "MySpeak", , False      On Error GoTo 0      Exit Sub    Else    If myValue <> "" Then     DoEvents     Application.Speech.Speak myValue    End If    myTime = Now() + TimeSerial(0, 0, 1)    Application.OnTime myTime, "MySpeak"    Cnt = Cnt + 1    End If End Sub

ksrnt
質問者

お礼

再三に渉りご指導いただきありがとうございました。 きっちり動きました。 「マクロは難しい」ということを実感させられ、あまり背伸びしないで初歩的なもので楽しむようにしたほうがいいのでは、と思っているところです。 でも「マクロは面白い」いろんなことをやってみたい。これにこりずに今後ともご指導くださるようお願いします。

その他の回答 (3)

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

こんにちは。 こんな方法はどうでしょうか?前よりは、多少良くなったとは思います。 完全に止まっている時間を作ってあげて、砂時計が出ていないときに、繰り返しボタンを押せば、とまります。 Dim CancelFlg As Boolean Dim myTime As Date Dim myValue As String Dim Cnt As Integer Private Sub CommandButton1_Click()   Dim c As Variant   CancelFlg = False   myTime = Now()   Cnt = 1   Call MySpeak   Range("A1").Select End Sub Private Sub MySpeak()     With Range("A1:B10")      .Cells(Cnt).Select      myValue = .Cells(Cnt).Value    End With    If CancelFlg Or myValue = "" Then      On Error Resume Next       Application.OnTime myTime, Me.Name & ".MySpeak", , False      On Error GoTo 0      Exit Sub    Else    If myValue <> "" Then     DoEvents     Application.Speech.Speak myValue    End If    myTime = Now() + TimeSerial(0, 0, 1)    Application.OnTime myTime, Me.Name & ".MySpeak"    Cnt = Cnt + 1    End If End Sub Private Sub CommandButton2_Click()  CancelFlg = True  myValue = "" End Sub

ksrnt
質問者

補足

早速追加のご教示ありがとうございます。 まことにお恥ずかしいのですが、残念ながら全くの初心者で十分理解できません。 「MySpeakが見当たりません」というエラーになってしまい実行することができません。 Private Sub MySpeak() を標準モジュールにもっていったり、Sub MySpeak()にしてみたりしましたがうまくいきません。折角のご好意を活用できなくて申し訳ありません。こんなことが出来ないのに、マクロの中断などと言っているのがおこがましいのかもしれません。 今は時間がないのでこれで失礼します。後刻ゆっくり勉強させてもらいます。ありがとうございました。

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

こんばんは。 マクロが稼動している最中は、ふつうは外部からの命令を受け付けません。DoEvents というのは、そこにメモリの空きを作って、命令を受けられるようになるのですが、この種のコントロールを使っているものは、難しいです。 一般的には、Flg のデータ型は、Boolean型です。数字型のFlg は、分岐がある場合のみです。 前回は、No.3709490 ですね。 '----------------------------------- Dim CancelFlg As Boolean  Private Sub CommandButton1_Click()   Dim c As Range '←これは中です。   CancelFlg = False   For Each c In Range("A1:B10")     Application.Speech.Speak c.Value     Application.Wait (Now + TimeValue("0:0:01"))     DoEvents     If CancelFlg Then Exit For   Next c   Range("A1").Select End Sub Private Sub CommandButton2_Click()  CancelFlg = True  ''以下のあるなしで試してみてください。  ''うまく行くときもあれば、そうでないこともあります。  'Application.SendKeys "^{ESC}" End Sub ただ、この種のブレークを入れるマクロは、本格的に書くと、非常に難しくなりますから、ある程度の妥協してください。ESCキーをブレークに換える方法もあるのですが、それ以外のマクロは、私は、以前、ここのカテゴリで書いたことはあるのですが、ハングの可能性も出てきますので、あまり自信がありません。

ksrnt
質問者

お礼

早速のご回答いただき恐縮です。 いつもながら、的確なお答えで感謝いたします。 前回のものは、ほぼ100%停止できましたが、今回のものはとまる時もあればとまらない時もある、でWaitを002,003と伸ばしてもそれほど改善はみられないようです。 そのため実用化は難しいかなという気もしております。 それでも今回、「 Range("A1:B10").Select」の扱い方などでも大変勉強になりました。今後ともよろしくお願いします。

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.1

経緯が分かりませんので、問題点や疑問点を書き起こしてくれた方が良いです。 調べる甲斐性も無いし…。 普通にExcel VBAのマクロを中断するのなら、Ctrl+Breakキーで可能なハズですが、こちらは効かないのでしょうか?

ksrnt
質問者

補足

大変失礼いたしました。 ユーザーフォームに配置したボタンでマクロを実行し、もう一つのボタンを押して中断させる、という形にしたかったのです。 たしかにESCボタンでも中断できますが、フォーム上で完結させたかったのです。画面を見るだけで操作が分かる形にしたいということです。

関連するQ&A