プロが教える店舗&オフィスのセキュリティ対策術

ExcelでVBAを使いアプリをつくっています。
プログラムを実行させるボタンはもちろんつくれるのですが、
プログラムを停止させるボタンをつくるにはどうしたら良いのかと悩んでいます。

ボタンに登録できるのはひとつのプロシージャですよね。
とすると「他のプロシージャを止める」プロシージャをつくらねばならないのでしょうか。とするとどうやって・・・?

A 回答 (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 は、一種の起動ツール。
当然に停止機能もあるが、停止を制御するには上記のような仕掛けが必要と思います。
    • good
    • 1
この回答へのお礼

ありがとうございました。

お礼が遅くなりすみませんでした。

参考にさせていただきます。
やっぱり、ループ処理が必要かも知れませんね。

お礼日時:2006/09/24 10:41

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

一応、これで止まります。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼が遅くなりすみませんでした。

参考にさせていただきます。

お礼日時:2006/09/24 10:40

停止ボタンプロシージャに


Stop
を書いておけば、とりあえずは止まるような気がします。但し、画面がVB Editorになってしまいますが。
あと、そのとき動いている処理に別の処理(停止ボタンをクリックした時の処理)を割り込ませるために、DoEventsを書いておく必要があるでしょうね。

でも、画面がVB Editorになるのはスマートではないですから、もっと別の仕組みを考える必要があります。
停止ボタンプロシージャで、グローバルな変数の値を変化させて、止めたい処理を定義しているプロシージャ内では、その変数が変化したら処理を止めるように定義しておくとか。

いずれにしても、停止ボタンを作ってそのプロシージャを定義するだけでは、正しく動くプログラムはできないでしょうね。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼が遅くなりすみませんでした。

参考にさせていただきます。

お礼日時:2006/09/24 10:39

#3 のWendy02です。



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

ありがとうございました。

お礼が遅くなりすみませんでした。

リンク先も参考にさせていただきます。

お礼日時:2006/09/24 10:41
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼が遅くなりすみませんでした。

リンク先も参考にさせていただきます。

お礼日時:2006/09/24 10:42

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
    • good
    • 0

こんにちは。



内容がはっきりしませんし、おっしゃっている論理が立たないのではありませんか?

>ボタンに登録できるのはひとつのプロシージャですよね。
そうです。

>とすると「他のプロシージャを止める」プロシージャをつくらねばならないのでしょうか。

そうしたら、1つを選択することは、他を選択しないことですから、「他のプロシージャ」を止める論理が成り立たないのではありませんか?

こちらは意味が違います。
>プログラムを実行させるボタンはもちろんつくれるのですが、
>プログラムを停止させるボタンをつくるにはどうしたら良いのかと悩んでいます。

プログラムを停止させるプログラムは、特殊なプログラムです。元のブログラムが分からなければ解答が出来ません。例えば、擬似的な無限ループを発生させているとか、OnTime メソッドを止める、イベント・ドリブン型のマクロを止める、これらはそれぞれが違います。

もう少し、具体的に説明してください。

この回答への補足

ありがとうございます。

>とすると「他のプロシージャを止める」プロシージャをつくらねばならないのでしょうか。
というのは、この場合「他のプロシージャを止めるプロシージャ」をつくってそれをボタンに登録する他はないのだろうか、という意味で書きました。

もしも、あらかじめシート上にコントロールボタンを作成しておき、
「このコントロールボタンを押したらプログラムを終了する」というイベントを、プロシージャの途中に記述できるのでしたら、それが一番良いですが、コントロールボタンには、プロシージャを登録する機能しかないのですよね?(プロシージャ内でのイベント機能はないのですよね?)

それと、
止めたい元のプログラムは、
Application.OnTime TimeValue("12:00:00")"proc"
Application.OnTime TimeValue("13:00:00")"proc"
というように、それぞれの行で設定した時刻に、procプロシージャ内に書かれた処理をします。

補足日時:2006/08/29 15:10
    • good
    • 0

次は、ウィンドウのアクセサリの[電卓]の起動と閉じるを繰り返すコマンドボタンです。



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

この回答への補足

ありがとうございます。
あっ、もしかして、私の質問文が、
他のアプリを起動させて停止させるプログラムを
たずねているように読めたのでしょうか。
失礼いたしました。

これはこれで大変勉強になりました。

また新しい回答をつけてくださっていますが(他の方も)
色々調べて回答内容をきちんと理解してからにしたいと思いますので、
しばしお返事遅れるご無礼をお許しください。

補足日時:2006/08/30 22:35
    • good
    • 0

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

この回答への補足

ありがとうございます。
とすると、
ひとつプロシージャをつくり、SendkeysでESCを送るプログラムを書いておけば・・・。

と思ったんですが、
しかし、私の環境(Excel2002)では、ESCキーを押してみても、実行が止まりませんし、ダイアログも出ません。
???

補足日時:2006/08/29 15:26
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A