• ベストアンサー

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

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

noname#101292
noname#101292

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

  • ベストアンサー
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

  • エクセルVBAが対応できるプログラムの大きさ

     エクセルVBAでプログラムの行数が2000行近くになるとプロシージャが大きすぎますとなり、実行できません。これには対処する方法はあるでしょうか。また、エクセル2013ではもっと大きなプロシージャにも対応しているのでしょうか。  よろしくお願いいたします。

  • EXCEL VBA 自動でプログラムの実行できますか

    EXCELのVBAでタイマー等を使用して一定の時間がきたら プログラムを実行させたいのですが、教えて下さい。 宜しくお願いします。

  • Excel VBA から外部プログラムを実行し結果を利用するには?

    Excel VBA から外部プログラム(例えば、Perl)を実行し、 その実行結果をVBAプログラム中で利用する方法を教えて ください。 より具体的にやりたいことを書きますと、 Perlでインターネット上の情報(数字)を取ってきて、 その情報をVBAで利用したいのですが。。。 よろしくお願いします。

  • VBAで他のBOOKのマクロの実行

    VBAの初心者です。 ExcelのVBAで他のBOOKに記載された標準モジュールのプロシージャを実行するにはどのようにコーディングすればよいのでしょうか?

  • VBAを実行しないと開けないエクセルファイル

    タイトルのようなエクセルファイルを作りたいです。 閲覧者がVBAの実行を認めない限り、閲覧不可にしたいのです。もし認めない場合はメッセージボックス等で「開くことができません」と表示され、エクセルが閉じるようにしたいです。 どのようなVBAのプログラムを組めば実行できますか?

  • エクセルVBAの一時停止後、 入力し再実行したい

    エクセルVBAでオートフィルター実行後に一時停止し、オートフィルターで選んだエクセルシート上のセルに直接入力た後、マクロを再実行させたい。 Sub Macro1() ' ' Macro1 Macro ' マクロ記録日 : 2008/3/2 '製品コードより枠番を選ぶ Selection.AutoFilter Field:=12, Criteria1:="=?????1*", Operator:=xlAnd 'ここで一時停止し、エクセルシート上で入力した後、次の行を実行したい Selection.AutoFilter Field:=12, Criteria1:="=?????2*", Operator:=xlAnd 'ここで一時停止し、エクセルシート上で入力した後、次の行を実行したい Range("A1").Select End Sub

  • VBAで作成したボタンが押せない

    WIN2000でEXCEL2000を使用しています。 エクセルのVBAでダイアログを作成しその中に オートシェイプの四角形ボタンを作成しました。 そのボタンを押すとマクロが実行されるように しています。 しかし、私のPCではボタンを押したら実行できるのに 他のPCではボタンを押しても実行されないPCも あります。他のPCもOS、EXCELは同じものです。 なぜこのような事が起きるのか教えてください。

  • エクセルを閉じる時のVBAのプログラム

    エクセルを閉じる時に実行するVBAのプログラムを記述する時は、 どのように記述すれば良いのでしょうか?

  • たまにマクロを実行できないときがある

    Excel VBAを使っていて、 たまにマクロを実行できないときがあります。 特にデバッグ途中というわけでもないのに、 マクロで実行したいプログラムを選択しても実行ボタンがグレー色になっており 実行することができません。 全てのプログラムではなく、実行途中に変な操作が入り、 停止したものだけです。 excelを再起動すると元に戻ります。 これはどういう状態にあるのでしょうか? 再起動せずに復帰する方法を教えてください。

  • エクセルVBAの実行保護について教えてください。

    エクセル2000VBAで構文を複数作り、シート上にボタンを配置し実行させたいと思います。 (パスワードで保護させて、VBAの構文は管理者以外に見えないようにしました) その複数のマクロの中には、実行させたくないものもあります。(管理者のみが行うマクロ) シート上のボタンで配置したもののみ実行可能にして、「ツール」-「マクロ」から誰でも実行させないような方法を教えてください。 つたない説明で申し訳ありませんが、ご理解いただけたでしょうか? よろしくお願い致します。

専門家に質問してみよう