• ベストアンサー

Excel VBAで「プログラム実行」ボタンと「プログラム停止」ボタンをつけたい

ExcelでVBAを使いアプリをつくっています。 プログラムを実行させるボタンはもちろんつくれるのですが、 プログラムを停止させるボタンをつくるにはどうしたら良いのかと悩んでいます。 ボタンに登録できるのはひとつのプロシージャですよね。 とすると「他のプロシージャを止める」プロシージャをつくらねばならないのでしょうか。とするとどうやって・・・?

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

  • ベストアンサー
noname#22222
noname#22222
回答No.9

s_husky です。 状況が判明したので再回答! Public StopNow As Boolean Public Sub Test()   Do Until StopNow     Sheets(1).Cells(1, 1) = Sheets(1).Cells(1, 1) + 1     Pause 10   Loop   If StopNow Then     MsgBox "Test の実行をストップしました。"   End If End Sub Public Sub Pause(ByVal PauseTime As Single)   Dim Finish As Single      Finish = Timer + PauseTime   Do     DoEvents   Loop Until Timer > Finish End Sub Private Sub CommandButton2_Click()   StopNow = True End Sub Private Sub CommandButton1_Click()   Test End Sub 起動したプロシージャを止める必要があるということはループ処理と理解。 ならば、ループの条件を操作すれば宜しいかと。 CommandButton1 で起動した Test は CommandButton1 で止めれます。 Application.OnTime TimeValue("16:30:00"), "Test" で起動しようと同じ理屈。 Application.OnTime は、一種の起動ツール。 当然に停止機能もあるが、停止を制御するには上記のような仕掛けが必要と思います。

noname#101292
質問者

お礼

ありがとうございました。 お礼が遅くなりすみませんでした。 参考にさせていただきます。 やっぱり、ループ処理が必要かも知れませんね。

その他の回答 (8)

  • bonaron
  • ベストアンサー率64% (482/745)
回答No.8

Dim flg As Boolean '無限ループのプロシージャ Public Sub DoLoop()   Dim i As Long   Dim j As Long   Dim k As Double   Do While True     For i = 1 To 100000       For j = 1 To 100000         k = 1# * i / i + 1# * j / j       Next       Debug.Print i       DoEvents       If flg Then         flg = False         Exit Sub       End If     Next   Loop End Sub '停止させるプロシージャ Public Sub DoStop()   flg = True End Sub 一応、これで止まります。

noname#101292
質問者

お礼

ありがとうございました。 お礼が遅くなりすみませんでした。 参考にさせていただきます。

  • incho0922
  • ベストアンサー率41% (84/204)
回答No.7

停止ボタンプロシージャに Stop を書いておけば、とりあえずは止まるような気がします。但し、画面がVB Editorになってしまいますが。 あと、そのとき動いている処理に別の処理(停止ボタンをクリックした時の処理)を割り込ませるために、DoEventsを書いておく必要があるでしょうね。 でも、画面がVB Editorになるのはスマートではないですから、もっと別の仕組みを考える必要があります。 停止ボタンプロシージャで、グローバルな変数の値を変化させて、止めたい処理を定義しているプロシージャ内では、その変数が変化したら処理を止めるように定義しておくとか。 いずれにしても、停止ボタンを作ってそのプロシージャを定義するだけでは、正しく動くプログラムはできないでしょうね。

noname#101292
質問者

お礼

ありがとうございました。 お礼が遅くなりすみませんでした。 参考にさせていただきます。

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

#3 のWendy02です。 #5 のhana-hana3さんのお書きになったリンク先で、様子を見させていただきます。ここ最近、何度か同様の質問がありましたので、検索すればヒットするはずです。

noname#101292
質問者

お礼

ありがとうございました。 お礼が遅くなりすみませんでした。 リンク先も参考にさせていただきます。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.5
noname#101292
質問者

お礼

ありがとうございました。 お礼が遅くなりすみませんでした。 リンク先も参考にさせていただきます。

noname#22222
noname#22222
回答No.4

s_husky です。 2度押し対策をしてないとテストで上手く動かないようなので・・・補足! Private Sub CommandButton1_Click() On Error Resume Next   Static isClick  As Boolean   Static isExecute As Boolean   Static APP      If Not isClick Then     isClick = True ' 二度押し対策     If Not isExecute Then       APP = Shell("calc.exe")     Else       AppActivate APP       SendKeys "%{F4}", True     End If     isExecute = Not isExecute     isClick = False   End If End Sub

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

こんにちは。 内容がはっきりしませんし、おっしゃっている論理が立たないのではありませんか? >ボタンに登録できるのはひとつのプロシージャですよね。 そうです。 >とすると「他のプロシージャを止める」プロシージャをつくらねばならないのでしょうか。 そうしたら、1つを選択することは、他を選択しないことですから、「他のプロシージャ」を止める論理が成り立たないのではありませんか? こちらは意味が違います。 >プログラムを実行させるボタンはもちろんつくれるのですが、 >プログラムを停止させるボタンをつくるにはどうしたら良いのかと悩んでいます。 プログラムを停止させるプログラムは、特殊なプログラムです。元のブログラムが分からなければ解答が出来ません。例えば、擬似的な無限ループを発生させているとか、OnTime メソッドを止める、イベント・ドリブン型のマクロを止める、これらはそれぞれが違います。 もう少し、具体的に説明してください。

noname#101292
質問者

補足

ありがとうございます。 >とすると「他のプロシージャを止める」プロシージャをつくらねばならないのでしょうか。 というのは、この場合「他のプロシージャを止めるプロシージャ」をつくってそれをボタンに登録する他はないのだろうか、という意味で書きました。 もしも、あらかじめシート上にコントロールボタンを作成しておき、 「このコントロールボタンを押したらプログラムを終了する」というイベントを、プロシージャの途中に記述できるのでしたら、それが一番良いですが、コントロールボタンには、プロシージャを登録する機能しかないのですよね?(プロシージャ内でのイベント機能はないのですよね?) それと、 止めたい元のプログラムは、 Application.OnTime TimeValue("12:00:00")"proc" Application.OnTime TimeValue("13:00:00")"proc" というように、それぞれの行で設定した時刻に、procプロシージャ内に書かれた処理をします。

noname#22222
noname#22222
回答No.2

次は、ウィンドウのアクセサリの[電卓]の起動と閉じるを繰り返すコマンドボタンです。 Private Sub CommandButton1_Click() On Error Resume Next   Static isExecute As Boolean   Static APP      If Not isExecute Then     APP = Shell("calc.exe")   Else     AppActivate APP, False     SendKeys "%({F4})", True   End If   isExecute = Not isExecute End Sub

noname#101292
質問者

補足

ありがとうございます。 あっ、もしかして、私の質問文が、 他のアプリを起動させて停止させるプログラムを たずねているように読めたのでしょうか。 失礼いたしました。 これはこれで大変勉強になりました。 また新しい回答をつけてくださっていますが(他の方も) 色々調べて回答内容をきちんと理解してからにしたいと思いますので、 しばしお返事遅れるご無礼をお許しください。

  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

通常なら[ESC]で止まります。

noname#101292
質問者

補足

ありがとうございます。 とすると、 ひとつプロシージャをつくり、SendkeysでESCを送るプログラムを書いておけば・・・。 と思ったんですが、 しかし、私の環境(Excel2002)では、ESCキーを押してみても、実行が止まりませんし、ダイアログも出ません。 ???

関連するQ&A