- ベストアンサー
Excel VBAで「プログラム実行」ボタンと「プログラム停止」ボタンをつけたい
ExcelでVBAを使いアプリをつくっています。 プログラムを実行させるボタンはもちろんつくれるのですが、 プログラムを停止させるボタンをつくるにはどうしたら良いのかと悩んでいます。 ボタンに登録できるのはひとつのプロシージャですよね。 とすると「他のプロシージャを止める」プロシージャをつくらねばならないのでしょうか。とするとどうやって・・・?
- みんなの回答 (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 は、一種の起動ツール。 当然に停止機能もあるが、停止を制御するには上記のような仕掛けが必要と思います。
その他の回答 (8)
- bonaron
- ベストアンサー率64% (482/745)
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 一応、これで止まります。
お礼
ありがとうございました。 お礼が遅くなりすみませんでした。 参考にさせていただきます。
- incho0922
- ベストアンサー率41% (84/204)
停止ボタンプロシージャに Stop を書いておけば、とりあえずは止まるような気がします。但し、画面がVB Editorになってしまいますが。 あと、そのとき動いている処理に別の処理(停止ボタンをクリックした時の処理)を割り込ませるために、DoEventsを書いておく必要があるでしょうね。 でも、画面がVB Editorになるのはスマートではないですから、もっと別の仕組みを考える必要があります。 停止ボタンプロシージャで、グローバルな変数の値を変化させて、止めたい処理を定義しているプロシージャ内では、その変数が変化したら処理を止めるように定義しておくとか。 いずれにしても、停止ボタンを作ってそのプロシージャを定義するだけでは、正しく動くプログラムはできないでしょうね。
お礼
ありがとうございました。 お礼が遅くなりすみませんでした。 参考にさせていただきます。
- Wendy02
- ベストアンサー率57% (3570/6232)
#3 のWendy02です。 #5 のhana-hana3さんのお書きになったリンク先で、様子を見させていただきます。ここ最近、何度か同様の質問がありましたので、検索すればヒットするはずです。
お礼
ありがとうございました。 お礼が遅くなりすみませんでした。 リンク先も参考にさせていただきます。
- hana-hana3
- ベストアンサー率31% (4940/15541)
>止めたい元のプログラムは、 下記参照。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1592860 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1911368
お礼
ありがとうございました。 お礼が遅くなりすみませんでした。 リンク先も参考にさせていただきます。
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)
こんにちは。 内容がはっきりしませんし、おっしゃっている論理が立たないのではありませんか? >ボタンに登録できるのはひとつのプロシージャですよね。 そうです。 >とすると「他のプロシージャを止める」プロシージャをつくらねばならないのでしょうか。 そうしたら、1つを選択することは、他を選択しないことですから、「他のプロシージャ」を止める論理が成り立たないのではありませんか? こちらは意味が違います。 >プログラムを実行させるボタンはもちろんつくれるのですが、 >プログラムを停止させるボタンをつくるにはどうしたら良いのかと悩んでいます。 プログラムを停止させるプログラムは、特殊なプログラムです。元のブログラムが分からなければ解答が出来ません。例えば、擬似的な無限ループを発生させているとか、OnTime メソッドを止める、イベント・ドリブン型のマクロを止める、これらはそれぞれが違います。 もう少し、具体的に説明してください。
補足
ありがとうございます。 >とすると「他のプロシージャを止める」プロシージャをつくらねばならないのでしょうか。 というのは、この場合「他のプロシージャを止めるプロシージャ」をつくってそれをボタンに登録する他はないのだろうか、という意味で書きました。 もしも、あらかじめシート上にコントロールボタンを作成しておき、 「このコントロールボタンを押したらプログラムを終了する」というイベントを、プロシージャの途中に記述できるのでしたら、それが一番良いですが、コントロールボタンには、プロシージャを登録する機能しかないのですよね?(プロシージャ内でのイベント機能はないのですよね?) それと、 止めたい元のプログラムは、 Application.OnTime TimeValue("12:00:00")"proc" Application.OnTime TimeValue("13:00:00")"proc" というように、それぞれの行で設定した時刻に、procプロシージャ内に書かれた処理をします。
次は、ウィンドウのアクセサリの[電卓]の起動と閉じるを繰り返すコマンドボタンです。 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
補足
ありがとうございます。 あっ、もしかして、私の質問文が、 他のアプリを起動させて停止させるプログラムを たずねているように読めたのでしょうか。 失礼いたしました。 これはこれで大変勉強になりました。 また新しい回答をつけてくださっていますが(他の方も) 色々調べて回答内容をきちんと理解してからにしたいと思いますので、 しばしお返事遅れるご無礼をお許しください。
- hana-hana3
- ベストアンサー率31% (4940/15541)
通常なら[ESC]で止まります。
補足
ありがとうございます。 とすると、 ひとつプロシージャをつくり、SendkeysでESCを送るプログラムを書いておけば・・・。 と思ったんですが、 しかし、私の環境(Excel2002)では、ESCキーを押してみても、実行が止まりませんし、ダイアログも出ません。 ???
お礼
ありがとうございました。 お礼が遅くなりすみませんでした。 参考にさせていただきます。 やっぱり、ループ処理が必要かも知れませんね。