こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

で、教えていただきたいのですが、"入力"を動かしている途中で
上記のマクロをとめるにはどうしたらよいのでしょう?
ご教授ください。

投稿日時 - 2009-09-21 14:06:01

QNo.5307338

すぐに回答ほしいです

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

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

投稿日時 - 2009-09-21 15:23:22

お礼

ありがとうございます。
自分の質問が間違えてました。
お詫びいたします。
質問文の下から3行目「入力」→「スタート」です。
ですから、スタートを走らせることによって入力が時間ごとに
実行され、その時間ごとの実行を途中で(不定期というか、気が付いた時に)
とめるにはどうしたらよいか、と言うことをお聞きしたかったのです。
本当に申し訳ありませんでした。

投稿日時 - 2009-09-21 15:59:37

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(9)

ANo.9

>お答えいただいたものを貼り付けて「入力」を実行したところ

こうした混乱が起きるのは、サブルーチン間に階層を意識されていないからでしょう。ある程度の階層を意識してサブルーチンの構成を考えるようにしてください。

たとえば、サブルーチンAの中で呼び出したサーブルーチンBが実はサブルーチンAを呼んでいたというような書き方、あるいはそれに類似した書き方は避けるべきです。特に初心者はそうです。
こうしたループのような書き方は、バグの原因になりますし、エラーになっても原因を特定しにくいです。十分に気をつけたほうがいいでしょう。

投稿日時 - 2009-09-21 22:29:30

ANo.8

#4の回答者です。

>私の質問の仕方が悪かったかも知れません。

こちらに今間違いを見出せません。私は、自分の内容にブレを感じていないので、初歩的な内容にあれこれと説明する気になれません。

>subスタートを実行して、sub停止を、例えば5秒後に実行すると
>メッセージボックスは停止のメッセージが出るのですが、データ
>自体は更新というか、書かれているのですが…

単純な内容ですから、はっきりいって、単独で私のコードを実行する限りは、ピンポイントでクリアしているのですから、そのような動作はありえません。「停止」後、メッセージが出れば動作しません。

ただ、他の方のものと共有して使えば、当たり前のことですが、動作は保障できません。ただし、#1の方のコードは、OnTime の時間登録の残りは全部クリアしていますから、停止した後は、残ることはありません。

できれば、OnTime のヘルプをみて、そのコードを写してやってみてください。ある程度コードが分かるなら、どうすればよいのか分かります。

投稿日時 - 2009-09-21 20:59:39

ANo.7

回答6です。

>お答えいただいたものを貼り付けて「入力」を実行したところ

ああ、いきなり「入力」を実行したのですね。それはいけませんね。
「スタート」を実行してください。
質問者さんの元のコードでも「入力」を実行したのでは、1回動作してそれっきりです。「スタート」からスタートしてください。

投稿日時 - 2009-09-21 18:26:31

ANo.6

回答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より右に一個以上データがないと期待通りには動作しません。ご自分で修正してください。

投稿日時 - 2009-09-21 18:00:02

ANo.5

#4 の補足
 'On Error Resume Next ''このコードは3行目のどこかに入力がないと、エラーが発生する
は、元のコードに対してですから、#4のコード自体には必要ありません。

投稿日時 - 2009-09-21 17:19:52

ANo.4

こんにちは。

>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

投稿日時 - 2009-09-21 17:17:47

お礼

ご回答いただきましてありがとうございます。

subスタートを実行して、sub停止を、例えば5秒後に実行すると
メッセージボックスは停止のメッセージが出るのですが、データ
自体は更新というか、書かれているのですが…

私の質問の仕方が悪かったかも知れません。

>OnTime は、通常、ピンポイント・タイムを、OnTime 時間,False 設定しないと、Excelを開いたままではOnTimeは終了しません。アプリケーションが開いている間は、OnTime の命令が生きています。

でも、これが大事なとこなんですよね。
もうちょっと勉強してみます。
ありがとうございます。

投稿日時 - 2009-09-21 20:26:33

ANo.3

#1です。
あなたのいうことが理解できません。
>その時間ごとの実行を途中で(不定期というか、気が付いた時に)とめるには
質問のプログラムは、「スタート」で6つのスケジュールを登録しています。
1.
これを気がついたときに、すでに実行したスケジュールは別にして、ある1つのスケジュールを中止して他は走らせるということですか。それもできないことではありませんが、スケジュール時間がわからなければダメです。

2.
これを気がついたときに、すでに実行したスケジュールは別にして、それ以降のスケジュールは中止するということですか。
私の回答はそうなっているのですが。
3.
あるいは、キー入力か、どこかのボタンクリックで中止したいということですか。
それはこのままではできません。ExcelをCloseするくらいしかありません。私の回答のコード「ontimecansel」をボタンに登録しておけばできますが。

何をどうしたいのでしょうか。

投稿日時 - 2009-09-21 16:25:12

お礼

たびたび申し訳ありませんでした。
できました。
私の勘違いでした。
ご回答ありがとうございました。

投稿日時 - 2009-09-21 16:29:47

ANo.2

取り消し方法はすでに回答がありますので、一機に時間登録せず、サブルーチン「入力」の中で次の登録をする方法を示します。

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

として、「入力停止」サブルーチンをボタンに登録しておきます。ちなみに、「入力」というサブルーチン名は一般的過ぎて避けた方がいいでしょう。

投稿日時 - 2009-09-21 15:58:09

お礼

ありがとうございます。
お答えいただいたものを貼り付けて「入力」を実行したところ
a3からiv3(3行目がすべて)までa1の値が書かれちゃったんですが…

投稿日時 - 2009-09-21 16:21:43

あなたにオススメの質問