• ベストアンサー

Excel VBA プログラムを止める命令

以前にも同じ趣旨の質問をしたのですが、 一度締め切った後も結局解決せず、少し自分でも質問の仕方が まとまって来たと思うので、再度質問させてください。 Ontimeメソッドで、あらかじめ時刻を指定し(これは複数あります) 印刷をかけさせるというプログラムをつくっているのですが、 そのプログラムを丸ごと止めるボタンというのをつくりたいのです。 Crtl+Breakをsendkeyで送るというのを考えたのですが、 私の環境(win2000+Excel2002)では、Crtl+Breakを押してもEscを押しても 反応している様子がなく、マクロの自動記録でも記録されないので、 果たしてそれを設定して有効かどうかもわからず、 具体的にどう記述すれば十分なのかも調べ切れませんでした。 Ontimeをピンポイントで止める、というのも 前回の質問でいただいた回答の中にあったのですが、 Ontimeというより、プロシージャもしくはモジュールを すべて停止させたいのです。 考える糸口だけでも、何かアイディアありましたらお願いいたします。

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

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

こんにちは。 前回というのは、これですか? http://oshiete1.goo.ne.jp/kotaeru.php3?q=2386642 できるだけ、情報は、多くお願いしますね。 #2 さんが、紹介されていた中に、私の発言があるので書かせていただきます。 前回は、私の書いたものが理解されている様子はありませんでした。 >http://oshiete1.goo.ne.jp/kotaeru.php3?q=1592860? 止めるためには、実行する時間に対して、それぞれピンポイントでFalseにしていかなくてはいけないっていうことなのですが、そうすることによって、OnTime の息の根を完全に止めることが出来ます。 OnTimeメソッドが生きている限りは、マクロとして仕事はしなくても、たぶん、インターラプトされるはずです。インターラプトされると、他のマクロが動かなくなったりする、不都合が出てきます。 サンプル(印刷の部分は、TimeBeepにしてあります) Private TimeSchedule(9) As Date '10個の時間データ-1 Sub TimerStart() '設定用マクロ Dim i As Integer Dim myOnTime As Date  For i = 1 To 10   myOnTime = Cells(i, 1).Value '"A1~A10まで時間を入力   TimeSchedule(i - 1) = myOnTime   Application.OnTime TimeSchedule(i - 1), "TimeBeep"  Next i End Sub Private Sub TimeBeep() '実行マクロ(サンプル・ダミー)  Beep  Cells(1, 3).Value = Cells(1, 3).Value + 1 End Sub Sub TimeCancel() 'キャンセル用マクロ  Dim i As Integer  Dim flg As Boolean  On Error Resume Next '既に終わったものに対するエラー回避  For i = LBound(TimeSchedule()) To UBound(TimeSchedule())   Application.OnTime TimeSchedule(i), "TimeBeep", Schedule:=False   If Err.Number = 0 And flg = False Then     flg = True   End If   Err.Clear  Next  On Error GoTo 0   If flg Then   MsgBox "設定を取り消しました。" '一個でも、止まれば出ます。   Else   MsgBox "設定が残っていません。"   End If   Erase TimeSchedule() '一度取り消したものは、復活しません。 End Sub

noname#101292
質問者

補足

ありがとうございます。 前回の質問というのは、これです。 「Excel VBAで「プログラム実行」ボタンと「プログラム停止」ボタンをつけたい」 http://okwave.jp/qa2370027.html とり急ぎ。 お礼はまた、お答えを理解した時点で、 余裕を持って書かせていただきますね。 それまで失礼いたしますのをお許しください。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

noname#60992
noname#60992
回答No.6

私は、EXCELはほとんど使ったことがないのではずしていたら大変もし分けないのですが、 VBAというものは何らかのイベント(タイミング)で(プログラム起動を含む)動き始め、終わるまでそれを実行し続けます。 OnTime イベントというのはVBAのイベントを作成するだけです。 このイベントはエクセルが動いる間は、キャンセルをしない限り時間が来れば実行されるものです。 要するにプロシージャやモジュールをとめることと、作成したイベントをとめることはまったく別な問題です。 モジュール自体をとめてもOnTime によって作成されたイベントは動きますし、OnTime自体をキャンセルしても現時点で動いているモジュールがとまるわけではないということです。 よって、OnTime イベントをピンポイントでとめるということと、モジュール自体をとめるという双方の行為が必要になります。 質問者様はOnTimeをとめる方法が知りたいのではなく、ほかの動いているモジュールをとめる方法を探しておられるのだと思いますが、ついでに印刷もとめたいということだと思います。 それにはちょっと情報が足りません。 何がどういう風に動いているという情報が必要です。 たぶんループ作業を行っている中にDoEventsなどを入れるだけでブレークできるようになると思います。 プリントをとめるのはエクセル上に何らかのデータを残しておいて、印刷のプログラム直前にアボートさせてしまうというロジックを作っておけば、OnTime で停止させる必要はないです。

全文を見る
すると、全ての回答が全文表示されます。
noname#60992
noname#60992
回答No.5

>・・・そうすると、VBA自体は動き続ける事になりますね。 Ontimeメソッド以外のイベントを使用されているのか、もしくはLoop処理をされているのでしょうか? Ontimeメソッド内で、プリント中か、停止中かをどこかに書き込んでおいて、(ANo2ではコマンドボタンのキャプションに書いていますが) 「シートに登録した時刻を書き換える」処理を行うかどうか判断する分岐をつければその処理をスキップさせることができると思います。  

noname#101292
質問者

補足

ありがとうございます。 そうですね。単純にOntimeのみのプログラムなのではなく、 他に色々と、エラートラップのための処理などをしていて、 全体ではモジュール3つにわたるものとなっています。 的外れな答えになってしまったら申し訳ないのですが、 ここで私が書いた意味は、たとえば 何かの条件が満たされた場合にOntimeを実行するとかという仕組みに してしまった場合、それはVBAが作動している上で 「印刷の実行をする、しない」を切り分けているという事なので、 プログラム全体を止めるという目的にかなわないという事です。 Ontimeを止めたいのでも、印刷を止めたいのでもなく、 VBAを止めたい、と・・・。

全文を見る
すると、全ての回答が全文表示されます。
  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.4

>・・・そうすると、VBA自体は動き続ける事になりますね。 そうですね。Ontime で呼ばれたプロシージャが呼び出されて実行に移りますが、先の文を各プロシージャに記載してあれば実行されてもすぐに終了する事になります。 >VBAは完全に止めてしまったほうが良いと思うのです。 でしたら、OnTime ・・・, False を書いたプロシージャを呼び出す事です。それ以外に完全に停止させる方法はありません。

全文を見る
すると、全ての回答が全文表示されます。
noname#60992
noname#60992
回答No.2

前回の質問を見ていないので、的外れになってしまうかもしれませんがご参考になれば幸いです。 いちいち、動かす時間を覚えていなくてはいけないみたいですが、 case0で設定したものは、case1でキャンセルできるようです。 (コマンドボタンをトグルにすることができます。) case1にほかにやりたいことを書けばそれらも実行されると思います。 Private Sub CommandButton1_Click() If Me.CommandButton1.Caption <> "START PRINTING" Then a (0,"15:00:00") Me.CommandButton1.Caption = "START PRINTING" Else a (1,"15:00:00") Me.CommandButton1.Caption = "STOP PRINTING" End If End Sub Sub a(x,strTime) Select Case x Case 0 Application.OnTime TimeValue(strTime), "prtForms" Case 1 Application.OnTime TimeValue(strTime), "prtForms", False End Select End Sub

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=1592860
全文を見る
すると、全ての回答が全文表示されます。
  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.1

>プロシージャもしくはモジュールをすべて停止させたいのです。 モジュールの中に変数やセルの値を参照して実行するかどうかを決める部分を埋め込む。 IF sheet("menu").Range("A1") = false then Exit Sub

noname#101292
質問者

補足

ありがとうございます。 つまり、停止ボタンをつけたいと思うならば、 ボタンを押す事で変数などが変化するようにし、 「実行しないようにする」訳ですよね。 ・・・そうすると、VBA自体は動き続ける事になりますね。 (違うのかな) 言葉足らずで申し訳なかったのですが、 プログラムを止めて何をするかと言うと、 シートに登録した時刻を書き換える」などの処理が起こり得るので、 「実行されないようにする」ではなく、 VBAは完全に止めてしまったほうが良いと思うのです。 ファイルを一度閉じてしまえば簡単なんですが、 使い心地を考えると停止ボタンをつけたいな、と思っています。 それがこんなに難しい事とは思いませんでしたが・・・。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • Excel VBAでセルに書いた時刻を取得したいのに・・・

    ExcelのVBAで、OnTimeを使い、 定時に印刷させるプログラムを組んでいます。 今までOnTimeの時刻設定に直接時刻を入れ込んでいたのですが、 ワークシートに登録した時刻を使うようにしたいと思い、 次のようにしたのですが、 Setのところの変数名で「オブジェクトが必要です」エラーが出ます。 ・・・何が悪いのでしょうか? Dim routinetime1 As String Dim routinetime2 As String Dim routinetime3 As String Set routinetime1 = Range("A1").Value Set routinetime2 = Range("B2").Value Set routinetime3 = Range("C3").Value Application.OnTime TimeValue(routinetime1), "印刷プロシージャ" Application.OnTime TimeValue(routinetime2), "印刷プロシージャ" Application.OnTime TimeValue(routinetime3), "印刷プロシージャ" よろしくお願いいたします。

  • OnTimeの取り消しについて

    ヘルプには次のように記述がありますが、指定時刻に 実行させるプロシージャーの取り消しはサンプルの手順 で動作しますが、何秒後・・・を指定した場合のサンプル はうまく取り消せません。"実行時エラー '1004'"と なります。 この場合、どのように記述すればいいのでしょうか? 使用例 次の使用例は、現在から 15 秒後に my_Procedure を実行します。 Application.OnTime Now + TimeValue("00:00:15"), "my_Procedure" 次の使用例は、午後 5 時に my_Procedure を実行します。 Application.OnTime TimeValue("17:00:00"), "my_Procedure" 次の使用例は、前の使用例で設定した OnTime メソッドの設定を取り消します。 Application.OnTime EarliestTime:=TimeValue("17:00:00"), _ Procedure:="my_Procedure", Schedule:=False

  • VBAにてメッセージボックスを最前面に表示させる

    エクセルVBAにて、指定時刻になったらメッセージボックスを、最前面に表示させるプログラムを作成中です。 時刻の指定は、ontimeメソッドの使用でできました。 しかし、最前面(他のアプリケーションを開いていても、メッセージボックスが手前に表示される)がどうしてもできません。。 VBだとAPI関数を使って、フォームを常に最前面表示はできました。 メッセージボックスで、このような表示方法は実現可能なのでしょうか? どなたか教えて下さい。よろしくお願いします。

  • VBAプロジェクトのパスワード解除について

    VBAプロジェクトのパスワードを解除した後VBAプロジェクトにあるモジュールを削除するというコードを書きました。 解除まではできていますが、モジュールを解除するコードにくると保護されているというエラーが出て進めません。 いくつかのことを確認しましたが、解決に至らなかったので、ご教示いただけないでしょうか。 確認した内容は以下のとおりです。 (1)パスワード解除後にブレークポイントを設定して、VBAプロジェクトを触ってみましたが、モジュールは展開されず、パスワードも要求されません。 (2)パスワード解除後プログラムを強制終了して、解除したエクセルをダブルクリックして開き、VBAプロジェクトを触ると、パスワードは解除されていて、モジュールも展開されました。 (3)パスワード解除とモジュール削除を別々のプロシージャにして、パスワード解除をしてプロシージャを終わらせて、改めてモジュール削除のプロシージャを実行してみましたが、VBAプロジェクトが保護されていますと出て、モジュール削除のコードが実行できない。 VBAで処理するのは不可能であるなら、PowerShellとの組み合わせなどでできるようになるのでしょうか? とりあえずは、xlsmをxlsxで保存し直すことでモジュールを削除するという目的は達成しておりますが、上記の方法でもやってみたいのでご教示お願いします。

  • エクセルのVBAについて。

    エクセルのVBAのことは全く分かりませんが、他人の書いたVBAを使わせてもらい、自動で一定の間隔ごとに私が記録したマクロを動すようにしています。 そこで質問なのですが、午前8時00から、午前2時00まで5分おきに動かしたいのですが、日付が変わると動作しなくなってしまいます。どこが悪いのでしょうか? Option Explicit Dim mcolTask As Collection Sub 実行予約() Dim i As Date Dim strProcName As String Dim datBigin As Date Dim datEnd As Date Dim datInterval As Date Dim datTimeout As Date Dim blnJustTime As Boolean ' Setting------------------------------------------------------- datBigin = TimeValue("08:00:00") ' 開始時刻 datEnd = TimeValue("02:00:00") ' 終了時刻 datInterval = TimeValue("00:05:00") ' 実行間隔(少なくとも数秒以上で) datTimeout = TimeValue("00:02:00") ' 実行待機タイムアウト blnJustTime = True ' datInterval で丸めるか strProcName = "MACRO1" ' 実行するマクロ名 '--------------------------------------------------------------- ' 既に実行予約されているか確認 If mcolTask Is Nothing Then ' 日付シリアル値を加算 datBigin = datBigin + Date datEnd = datEnd + Date ' 終了時刻が開始時刻より小さければ日をまたぐので補正 If datEnd < datBigin Then datEnd = datEnd + 1 ' 現在時刻が既に終了時刻を過ぎている場合 If datEnd < Now() Then MsgBox "終了時刻を過ぎているため予約できません。", vbCritical, "終了" Exit Sub End If ' 現在時刻が開始時刻を過ぎていれば補正 If datBigin < Now() Then ' 開始時刻を datInterval で指定された値で丸めるか If blnJustTime Then datBigin = Application.Floor(Now() + datInterval, datInterval) Else datBigin = Now() + datInterval End If End If ' 初期化 Set mcolTask = New Collection ' メイン部分 For i = datBigin To datEnd Step datInterval ' 後から取り消せるようにコレクションに退避 mcolTask.Add CStr(i) & "," & strProcName ' Application.Ontime で実行予約を行う Application.OnTime EarliestTime:=i, _ Procedure:=strProcName, _ LatestTime:=i + datTimeout, _ Schedule:=True Next i Else MsgBox "既に実行中です", vbInformation End If End Sub

  • 指定した時刻になるとセルに色がつくようにしたい

    初心者です。エクセルのVBAで設定した時刻になったらセルに色がつくようにしたいです。 例えば、17:00時にA1セル、18:00にA2セルに色を自動でつくようにしたいと思っています。 OnTimeを使ったらよいと思っていろいろ試しましたが、設定した時刻になってもなにも起こりません。 標準モジュールに以下の内容を記述して、パソコンの時計を変更して確認しています。 できたらクリックしないでファイルオープンしてなにもせずに設定時刻に実行されるようにしたいです。 最初の3秒でB1に現在の時間を取得。 セルA1とA2をクリアしてから設定時間に色をつけるようにしたつもりです。 下記が記述内容です。 Sub 指定時間にマクロを開始() Dim stime As Date Range("A1") = "" Range("A2") = "" Range("B1").Select stime = Now + TimeValue("00:00:03") Application.OnTime TimeValue(stime), "マクロ実行内容", TimeValue("00:05:00") End Sub Sub 時刻の設定1() Application.OnTime EarliestTime:=TimeValue("17:00:00"), Procedure:="Test" End Sub Sub Procedure() Range("A1").Interior.ColorIndex = 8 End Sub Sub 時刻の設定2() Application.OnTime EarliestTime:=TimeValue("18:00:00"), Procedure:="Test" End Sub Sub Procedure2() Range("A2").Interior.ColorIndex = 9 End Sub 実行マクロは有効にしています。 ご教授よろしくお願いします。

  • Office2007におけVBA

    お世話になります。 現在、職場ではMSのOffice2003を利用しており、2007を導入する事を検討しております。 そこで、噂では2003で作ったVBAなどのExcelプログラムで動かないメソッド(?)があると聞いたのですがネットで調べても ピンポイントで該当ページが見つかりません。 ただの噂なのかはっきりさせたいので、こちらに質問させて頂きました。 どうか、ご教授ください。 よろしくお願いします。

  • VBAの初歩的な質問

    VBAの基本的な事なのですが(すいません、あまりに初歩的な事なのでこちらに質問させていただきました。) よく、プログラミングを書く時に、プログラム途中で、行が1つ2つ続けて空いている時ありますよね。あれは、何か意味があるのですか。 改行した所で、一つの処理が終わってますよね?(1行、2行・・空いて無くても処理は変わらないですよね?) それと、プログラム途中で、書き出しの頭がそろえる時とづらす時もありますよね。 あれも、何か意味があるのですか?(ここからここまでの処理と見やすくするため?) 例 づらしてない時 Sub test01() With Sheets("Sheet1").Range("A1") .Value = Time .NumberFormatLocal = "h:mm:ss" End With Application.OnTime Now + TimeValue("0:00:01"), "test01" End Sub づらしている時 Sub test01()   With Sheets("Sheet1").Range("A1")     .Value = Time     .NumberFormatLocal = "h:mm:ss"   End With  Application.OnTime Now + TimeValue("0:00:01"), "test01" End Sub それと、もう一つすいません VBAの→標準モジュールの→モジュール1内にプログラムが一つ入っています。 そのプログラムはシート1でDDEで取り込んだデータ(シート1の特定のセルに入っている)を計算、蓄積、記録など処理するようにプログラムが入っています。 そのシート1と同じ処理をシート2、3、4、(セル位置は一緒)にも同じくさせたいのですが、(それぞれのシートでDDEのデータが変わってくるのですが) そのような場合は、基本的な考え(作り方)として 標準モジュールのプログラム内で書き換えるだけで対処出来るのでしょうか? それとも、エクセルオブジェクト内→シート1やシート2などに、個別にプログラムを(多少書き換えて)入れていく感じになるのでしょうか? どなたか、ご存じの方おられましたら、よろしくお願いします。

  • 難し過ぎるエクセルVBAを何故簡単にできないのか?

     エクセルを始めて2年位になりますが、ようやく簡単なマクロを作ったりできるようになりました。  もっと便利な自動化手順をマスターするにはVBAを勉強する必要があります。  少しばかり参考書を読みましたが、英語の記述が非常に分かりにくく、大変奥の深いものと思います。  複雑な条件(条件分岐等)処理をするにはマクロだけではできませんが、VBAはプロシージャ、コード、モジュール、ステートメント等、聞き慣れない用語が多く、あまりにもレベルが高すぎて続きそうもないなぁという気がしています。  万人が理解でき、使いこなせる代物とは思えません。正直、これをマスターされている方はどのように勉強されたのか知りたいほどです。何も知らない素人が独学でマスターできるようには思えません。  私の理想として何で、英語でなく日本語で記述していないのかと腹が立ちます。  MSエクセルも都度、バージョンアップがされていますが、この辺の内容は全然、分かりやすくはなっていないと強く思います。  何故、もっと簡単に、日本語でも操作できるようにはならないものかと怒りを覚えます。  プログラムの構成上、無理なんでしょうか?難しいプロシージャやコード名を覚えなくても、単純なマクロのように操作を記録し、その操作を忠実に実行再現できるようになっておればどんなに『便利なのになぁ』と思います。これで誰でも使えるとマイクロソフトは思っているのでしょうか?  私としては英語記述を入力しなくても、日本語の操作目次があって、この操作したら日本語で解説されるまた、日本語コマンドでコード入力ができるようにして欲しいのです。MSにはそんな気がないのですかね。多くの日本のエクセルユーザーそんな思いは持っていないのでしょうか? 

  • Excel TimeValueをしようしたループマクロの待機中のCPU開放について教えて頂けませんでしょうか?

    質問1: 10秒間隔で”解析1”のマクロを実行する下記のPrgですと待機の10秒間 ビジーになってしまいます。解決方法ご存知の方教えて下さい。 Sub 解析1実行用ループマクロ() Do 指定時刻 = Now + TimeValue("0時00分10秒") '10秒後 待ち時間 = TimeValue("0時00分05秒") Application.OnTime TimeValue(指定時刻), "解析1", TimeValue(待ち時間) Loop End Sub  (マクロ集引用しただけで理解はあまりできていません。) 質問2: ループを終了させるのにEscで終わらせています。Escをボタンに登録しようと思ってますが他にスマートな方法有りますでしょうか?

このQ&Aのポイント
  • フォークリフトの求人に応募し採用されたが、手作業で運搬する仕事であり、実際の仕事内容と期待がずれていたため、半日で退職したことが問題になっている。
  • 友人知人からは「我慢してやれ」と非難を浴びたが、リフトで運ぶと書かれた求人情報が手作業だったため、腰痛やヘルニアになりやすく、半日で辞めたことは非常識ではないかと考えている。
  • 求人情報と実際の仕事内容のギャップが問題になっている中、半日で退職したことについて、理不尽と非常識の両論が飛び交っている。
回答を見る