- ベストアンサー
Excelのontimeについて
a1に数式が入っています。 c3からd3,e3,f3…に一定時間ごとにa1の値を入力するマクロがあります。 Sub 入力() Sheets("Sheet1").Select Range("a3").End(xlToRight).Offset(0, 1).Select ActiveCell.Value = Cells(1, 1).Value End Sub Sub スタート() Dim MyTime As Date Dim Jikan As Date Dim i As Integer Jikan = TimeValue("13:59:00") For i = 0 To 5 MyTime = Jikan + TimeSerial(0, 0, 5) * i Application.OnTime MyTime, "入力" Next End Sub で、教えていただきたいのですが、"入力"を動かしている途中で 上記のマクロをとめるにはどうしたらよいのでしょう? ご教授ください。
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
OnTimeをキャンセルするのは、スケジュール時間がわかっていないとダメなので、それがわかるようにプログラムする。 たとえば、下記。 Dim MyTime(5) As Date 'これをモジュールのはじめで宣言しておく。 Sub スタート() Dim Jikan As Date Dim i As Integer Jikan = TimeValue("15:20:00") For i = 0 To 5 MyTime(i) = Jikan + TimeSerial(0, 0, 5) * i Application.OnTime MyTime(i), "入力" Next End Sub 適当なときに下記を実行して停止する。 Sub ontimecansel() On Error GoTo trap For i = 0 To 5 Application.OnTime MyTime(i), "入力", , False Next Exit Sub trap: Resume Next End Sub
その他の回答 (8)
- cistronezk
- ベストアンサー率38% (120/309)
>お答えいただいたものを貼り付けて「入力」を実行したところ こうした混乱が起きるのは、サブルーチン間に階層を意識されていないからでしょう。ある程度の階層を意識してサブルーチンの構成を考えるようにしてください。 たとえば、サブルーチンAの中で呼び出したサーブルーチンBが実はサブルーチンAを呼んでいたというような書き方、あるいはそれに類似した書き方は避けるべきです。特に初心者はそうです。 こうしたループのような書き方は、バグの原因になりますし、エラーになっても原因を特定しにくいです。十分に気をつけたほうがいいでしょう。
- Wendy02
- ベストアンサー率57% (3570/6232)
#4の回答者です。 >私の質問の仕方が悪かったかも知れません。 こちらに今間違いを見出せません。私は、自分の内容にブレを感じていないので、初歩的な内容にあれこれと説明する気になれません。 >subスタートを実行して、sub停止を、例えば5秒後に実行すると >メッセージボックスは停止のメッセージが出るのですが、データ >自体は更新というか、書かれているのですが… 単純な内容ですから、はっきりいって、単独で私のコードを実行する限りは、ピンポイントでクリアしているのですから、そのような動作はありえません。「停止」後、メッセージが出れば動作しません。 ただ、他の方のものと共有して使えば、当たり前のことですが、動作は保障できません。ただし、#1の方のコードは、OnTime の時間登録の残りは全部クリアしていますから、停止した後は、残ることはありません。 できれば、OnTime のヘルプをみて、そのコードを写してやってみてください。ある程度コードが分かるなら、どうすればよいのか分かります。
- cistronezk
- ベストアンサー率38% (120/309)
回答6です。 >お答えいただいたものを貼り付けて「入力」を実行したところ ああ、いきなり「入力」を実行したのですね。それはいけませんね。 「スタート」を実行してください。 質問者さんの元のコードでも「入力」を実行したのでは、1回動作してそれっきりです。「スタート」からスタートしてください。
- cistronezk
- ベストアンサー率38% (120/309)
回答2です。 >お答えいただいたものを貼り付けて「入力」を実行したところ >a3からiv3(3行目がすべて)までa1の値が書かれちゃったんですが… どうやら「スタート」サブルーチンをマクロ停止すると、IntervalTimeが0になって「入力」を実行し、最後の列までいってエラー停止するようです。 >Sub 入力() > If bStopInput Then Exit Sub この部分をを Sub 入力() If bStopInput Or IntervalTime < TimeSerial(0, 0, 1) Then Exit Sub と修正すればいいと思いますが、いまひとつすっきりしない解決策ではあります。 なお、 > With Sheets("Sheet1") > .Range("A3").End(xlToRight).Offset(0, 1).Value = .Cells(1, 1).Value > End With これは元のコードをまとめたものですが、3行目にはデータがないとエラーになります。またA3だけにデータがあってもIV3まですっ飛んでしまいますので、B3より右に一個以上データがないと期待通りには動作しません。ご自分で修正してください。
- Wendy02
- ベストアンサー率57% (3570/6232)
#4 の補足 'On Error Resume Next ''このコードは3行目のどこかに入力がないと、エラーが発生する は、元のコードに対してですから、#4のコード自体には必要ありません。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 >c3からd3,e3,f3…に一定時間ごとにa1の値を入力するマクロがあります。 質問のコードは間違いですね。 たぶん、このコードは、DDEか、OLEでインポートされた数値データを時系列に並べるものだと思います。 OnTime は、通常、ピンポイント・タイムを、OnTime 時間,False 設定しないと、Excelを開いたままではOnTimeは終了しません。アプリケーションが開いている間は、OnTime の命令が生きています。 '------------------------------------------- Private MyTime As Date Private i As Long Private Sub 入力() With Worksheets("Sheet1") 'On Error Resume Next ''このコードは3行目のどこかに入力がないと、エラーが発生する .Cells(3, Columns.Count).End(xlToLeft).Offset(0, 1).Value = Cells(1, 1).Value 'On Error GoTo 0 End With If i < 5 Then i = i + 1 Call スタート End If End Sub Sub スタート() Dim Jikan As Date Jikan = TimeValue(""13:59:00") MyTime = Jikan + TimeSerial(0, 0, 5) * i 'MyTime = Time + TimeSerial(0, 0, 5) ''現在時刻の試験用 Application.OnTime MyTime, "入力" End Sub Sub 停止() On Error GoTo Errhandler Application.OnTime MyTime, "入力", False Errhandler: If Err.Number > 0 Then MsgBox MyTime & "の設定時間は解除できませんでした。", vbExclamation Else MsgBox MyTime & "の設定時間は解除しました。", vbInformation End If End Sub
お礼
ご回答いただきましてありがとうございます。 subスタートを実行して、sub停止を、例えば5秒後に実行すると メッセージボックスは停止のメッセージが出るのですが、データ 自体は更新というか、書かれているのですが… 私の質問の仕方が悪かったかも知れません。 >OnTime は、通常、ピンポイント・タイムを、OnTime 時間,False 設定しないと、Excelを開いたままではOnTimeは終了しません。アプリケーションが開いている間は、OnTime の命令が生きています。 でも、これが大事なとこなんですよね。 もうちょっと勉強してみます。 ありがとうございます。
- okormazd
- ベストアンサー率50% (1224/2412)
#1です。 あなたのいうことが理解できません。 >その時間ごとの実行を途中で(不定期というか、気が付いた時に)とめるには 質問のプログラムは、「スタート」で6つのスケジュールを登録しています。 1. これを気がついたときに、すでに実行したスケジュールは別にして、ある1つのスケジュールを中止して他は走らせるということですか。それもできないことではありませんが、スケジュール時間がわからなければダメです。 2. これを気がついたときに、すでに実行したスケジュールは別にして、それ以降のスケジュールは中止するということですか。 私の回答はそうなっているのですが。 3. あるいは、キー入力か、どこかのボタンクリックで中止したいということですか。 それはこのままではできません。ExcelをCloseするくらいしかありません。私の回答のコード「ontimecansel」をボタンに登録しておけばできますが。 何をどうしたいのでしょうか。
お礼
たびたび申し訳ありませんでした。 できました。 私の勘違いでした。 ご回答ありがとうございました。
- cistronezk
- ベストアンサー率38% (120/309)
取り消し方法はすでに回答がありますので、一機に時間登録せず、サブルーチン「入力」の中で次の登録をする方法を示します。 Dim bStopInput As Boolean Dim IntervalTime As Date Sub 入力() If bStopInput Then Exit Sub With Sheets("Sheet1") .Range("A3").End(xlToRight).Offset(0, 1).Value = .Cells(1, 1).Value End With Application.OnTime Now + IntervalTime, "入力" End Sub Sub 入力停止() bStopInput = True End Sub Sub スタート() bStopInput = False IntervalTime = TimeSerial(0, 0, 4) Application.OnTime TimeValue("13:59:00"), "入力" End Sub として、「入力停止」サブルーチンをボタンに登録しておきます。ちなみに、「入力」というサブルーチン名は一般的過ぎて避けた方がいいでしょう。
お礼
ありがとうございます。 お答えいただいたものを貼り付けて「入力」を実行したところ a3からiv3(3行目がすべて)までa1の値が書かれちゃったんですが…
お礼
ありがとうございます。 自分の質問が間違えてました。 お詫びいたします。 質問文の下から3行目「入力」→「スタート」です。 ですから、スタートを走らせることによって入力が時間ごとに 実行され、その時間ごとの実行を途中で(不定期というか、気が付いた時に) とめるにはどうしたらよいか、と言うことをお聞きしたかったのです。 本当に申し訳ありませんでした。