【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】

検索の仕方なのか、判らないので教えてください。

ExcelのVBAではApplication.OnTime メソッドがあり、

Application.OnTime TimeValue("17:00:00"), "test01"

とすれば、17時ちょうどにtest01というプロシージャが実行されます。

フォームを作って
Application.OnTime UserForm1.TextBox1.Value, "test01"

のようにすれば、TextBox1に時間指定して、その指定時間にtest01を起動する事も可能で、業務用アプリとして実際に使用しています。


では、これをVisual Basic 2010で同じように実行するにはどうしたら可能でしょうか?

googleで調べても、時計のように、一定時間(1秒ごと)にラベルの内容を書き換え表示するようなサンプルは見つかるのですが、指定時間に、指定の処理を実行する というようなサンプルは見つかりませんでした。

指定時間にFTPにファイルをアップしたり、指定時間にWEBブラウザからHTMLを取得したりと、いろいろ使い道があって結構つかっていますので、この「指定した時間に、処理○○を記述したプロシージャーを実行して」という処理ができないとかなり困ります。

A 回答 (4件)

No.1です。



お礼に書かれているような感じでよいかと思います。

Timerというと、それが時間を監視しているように思われがちですが、今回の分でいうと、指定したインターバル(ミリ秒単位)で、時計を見るのを延々と繰り返しているだけですね。

それに対して、時刻を書いたメモ紙を渡して、「時計を見たときに、この時間だったらこんな風にしてね」とお願いしていると。

複数の異なるタスクがある場合も、メモ紙を増やすだけで良いので、使い勝手はよいと思います。
    • good
    • 0
この回答へのお礼

テストで、

------------------------
Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
Dim thday1 As Date
Dim thday2 As Date

thday2 = Now()
Me.Label2.Text = thday2

thday1 = Me.TextBox1.Text

If thday1 > thday2 Then
Me.Label2.Text = "現在時刻 " & thday2
Else
Me.Label2.Text = "過ぎました"
End If
End Sub
------------------------

と組んだら、TextBox1に入れた時刻を過ぎた所で、「過ぎました」に変わりました。

ここに処理内容を記述すれば、なんとかなりそうです。

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

お礼日時:2014/04/11 19:47

> 1日1回ならタスクスケジューラでもOKかもしれませんが、8時間だったり、別のプログラムでは12時間毎だったりと、


> 指定の時間に作業をするのに便利だったもので、Application.OnTime はけっこう使ってしまいました。
>
> 何か代替方法があるといいのですが…
代替方法も何も、そのものずばり一定時間おきに繰り返す設定もできるのですが。
http://www.atmarkit.co.jp/fwin2k/win2ktips/1332r …
    • good
    • 0
この回答へのお礼

ありがとうございます。

タスクスケジューラーは、まさにリンク先に書かれているとおり
「1日1回とか、毎週1回といったタイミングで、指定・登録したプログラムを実行するだけ」
と思っていました。

時間や分で指定する抜け道があったとは…
今回はタイマーでなんとかなりそうですが、他に使い道があったら使ってみます。

お礼日時:2014/04/14 08:59

> 指定時間にFTPにファイルをアップしたり、指定時間にWEBブラウザからHTMLを取得したり


それはプログラムでどうこうするんじゃなくってタスクスケジューラを使った方がいいんじゃないかなぁ。
http://technet.microsoft.com/ja-jp/library/cc721 …

これを使えば、特定の時間に特定のプログラムを起動することができるから、「FTPにファイルをアップ」とか「WEBブラウザからHTMLを取得」とかだけするプログラムなりスクリプトなりをつくって、スケジューラに「毎日××時に○○を実行」という風に設定すればお望みのことはできますよ。
    • good
    • 0
この回答へのお礼

ありがとうございます。
言葉が足らなかったようですみません。

現在のVBAでは、フォームが起動する時に、UserForm_Initializeで、TextBox1にNow()を取り込んでいるので、


----------------------------
Sub test1()

Dim adtim As Variant

''次回動作時間を決定

adtim = DateAdd("h", 8, TextBox1.Value)
Application.OnTime adtim, "test1"
TextBox1.Value = adtim

~プログラム作動(例)HTML取得~

End Sub

----------------------------

のような記述になっていて、現在の時間に8時間を加えた時間が次回起動時間となり、8時間後に同じ処理が起動します。
以下、強制断するまで8時間毎にこのtest1 が自動で繰り返される事になります。

1日1回ならタスクスケジューラでもOKかもしれませんが、8時間だったり、別のプログラムでは12時間毎だったりと、指定の時間に作業をするのに便利だったもので、Application.OnTime はけっこう使ってしまいました。

何か代替方法があるといいのですが…

お礼日時:2014/04/11 09:31

現在はVBをインストールしていないので、チェックできませんが、タイマーで、一定時間ごとに、指定の時間の範囲内に入っているかどうかを判別、入っているならばプロシージャを実行するというのはどうでしょうか?



注意しなくてはいけないのは、指定の時間の「範囲」の設定と、一度実行されたならば、次は無視するようにしないように工夫する必要がある点だと思います。

タイマーが1秒設定で、範囲は指定時間±1秒とした場合、そのあたりをやっていないと、2回実行されるリスクがあります。
    • good
    • 0
この回答へのお礼

ありがとうございます。

例えば6時間毎にプログラムを起動したい場合は、AddHours で6時間後の時間を指定して、タイマーでその時間の範囲に入っているかどうかをチェック。

範囲に入っていたら、プロシージャを起動し、時間を6時間後にずらす…

という処理の繰り返しという事でしょうか?

試験的にタイマーをつくってテストしてみます。

お礼日時:2014/04/11 09:36

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

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


おすすめ情報