- ベストアンサー
Excel VBAで「プログラム実行」ボタンと「プログラム停止」ボタンをつけたい
ExcelでVBAを使いアプリをつくっています。 プログラムを実行させるボタンはもちろんつくれるのですが、 プログラムを停止させるボタンをつくるにはどうしたら良いのかと悩んでいます。 ボタンに登録できるのはひとつのプロシージャですよね。 とすると「他のプロシージャを止める」プロシージャをつくらねばならないのでしょうか。とするとどうやって・・・?
- オフィス系ソフト
- 回答数9
- ありがとう数6
- みんなの回答 (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キーを押してみても、実行が止まりませんし、ダイアログも出ません。 ???
関連するQ&A
- エクセルVBAが対応できるプログラムの大きさ
エクセルVBAでプログラムの行数が2000行近くになるとプロシージャが大きすぎますとなり、実行できません。これには対処する方法はあるでしょうか。また、エクセル2013ではもっと大きなプロシージャにも対応しているのでしょうか。 よろしくお願いいたします。
- ベストアンサー
- その他MS Office製品
- EXCEL VBA 自動でプログラムの実行できますか
EXCELのVBAでタイマー等を使用して一定の時間がきたら プログラムを実行させたいのですが、教えて下さい。 宜しくお願いします。
- ベストアンサー
- オフィス系ソフト
- Excel VBA から外部プログラムを実行し結果を利用するには?
Excel VBA から外部プログラム(例えば、Perl)を実行し、 その実行結果をVBAプログラム中で利用する方法を教えて ください。 より具体的にやりたいことを書きますと、 Perlでインターネット上の情報(数字)を取ってきて、 その情報をVBAで利用したいのですが。。。 よろしくお願いします。
- 締切済み
- オフィス系ソフト
- VBAで他のBOOKのマクロの実行
VBAの初心者です。 ExcelのVBAで他のBOOKに記載された標準モジュールのプロシージャを実行するにはどのようにコーディングすればよいのでしょうか?
- ベストアンサー
- オフィス系ソフト
- VBAを実行しないと開けないエクセルファイル
タイトルのようなエクセルファイルを作りたいです。 閲覧者がVBAの実行を認めない限り、閲覧不可にしたいのです。もし認めない場合はメッセージボックス等で「開くことができません」と表示され、エクセルが閉じるようにしたいです。 どのようなVBAのプログラムを組めば実行できますか?
- ベストアンサー
- Visual Basic
- エクセル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
- ベストアンサー
- Windows XP
- VBAで作成したボタンが押せない
WIN2000でEXCEL2000を使用しています。 エクセルのVBAでダイアログを作成しその中に オートシェイプの四角形ボタンを作成しました。 そのボタンを押すとマクロが実行されるように しています。 しかし、私のPCではボタンを押したら実行できるのに 他のPCではボタンを押しても実行されないPCも あります。他のPCもOS、EXCELは同じものです。 なぜこのような事が起きるのか教えてください。
- 締切済み
- オフィス系ソフト
- たまにマクロを実行できないときがある
Excel VBAを使っていて、 たまにマクロを実行できないときがあります。 特にデバッグ途中というわけでもないのに、 マクロで実行したいプログラムを選択しても実行ボタンがグレー色になっており 実行することができません。 全てのプログラムではなく、実行途中に変な操作が入り、 停止したものだけです。 excelを再起動すると元に戻ります。 これはどういう状態にあるのでしょうか? 再起動せずに復帰する方法を教えてください。
- 締切済み
- Visual Basic
- エクセルVBAの実行保護について教えてください。
エクセル2000VBAで構文を複数作り、シート上にボタンを配置し実行させたいと思います。 (パスワードで保護させて、VBAの構文は管理者以外に見えないようにしました) その複数のマクロの中には、実行させたくないものもあります。(管理者のみが行うマクロ) シート上のボタンで配置したもののみ実行可能にして、「ツール」-「マクロ」から誰でも実行させないような方法を教えてください。 つたない説明で申し訳ありませんが、ご理解いただけたでしょうか? よろしくお願い致します。
- 締切済み
- オフィス系ソフト
お礼
ありがとうございました。 お礼が遅くなりすみませんでした。 参考にさせていただきます。 やっぱり、ループ処理が必要かも知れませんね。