旅行好きのおしりトラブル対策グッズ3選

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

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を取得したりと、いろいろ使い道があって結構つかっていますので、この「指定した時間に、処理○○を記述したプロシージャーを実行して」という処理ができないとかなり困ります。

このQ&Aに関連する最新のQ&A

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に関連する人気のQ&A

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

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q一定時間ごとの実行

VB2005環境です。

5分おきにメソッド”deserializeSample()”を実行させたいのですが
どのようにすればいいのでしょうか。
調べてもわからなかったので教えてください。

Aベストアンサー

お世話になります。

VS のデザイナでツールボックスより、
Timer をフォームにドラッグします。

以下のコードをコードエディタで記述します。
Public Class Form1
  Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Me.Timer1.Enabled = True
    Me.Timer1.Interval = 1000 * 60 * 5 '5分毎
    Me.Timer1.Start()
  End Sub

  Private Sub Timer1_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    ' 5 分ごとにやりたい処理
  End Sub
End Class

QCloseとDisposeの違い

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、タイマーコントロールのイベントに記述していますと、それは実行され続けます。

これを防ぐために、Me.Dispose() を使います。すると、きれいにプロセスは終了し、イベントは発生しない模様です。

そこで、「フォームを閉じる」意味のMe.Close() をすべてMe.Dispose() に変えてしまいました。確実にプロセスを破棄出来ると思ったからです。Webで調べると、違いは「再利用できる、できないの違い」という答えがありましたが、それはきっと、ファイルやオブジェクトのことで、フォームの場合は、再びShowまたはShowDialogで表示させることは可能でしたので、特に問題は感じていませんでした。

ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。Me.Close() に変えるとうまくいきました。

わけわからなくなってきました。。。

ちなみに、その残ったフォームは、スタートアップフォームであり、別のフォームからShowまたはShowDialogメソッドで呼び出したものではありません。

ここで4つの仮説を立ててみました。

1. ShowDialogで呼び出したフォームは、Me.Dispose()、Showで呼び出した、あるいは、スタートアップフォームは、Me.Close() すれば破棄できる

2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

3. 呼び出し方ではなく、別の要因が存在する

4. 併記する必要がある場合がある

Me.Close()
Me.Dispose()

または、

Me.Dispose()
Me.Close()



どれが正しいのでしょうか?どなたがご存じの方がいらっしゃいましたら、ご教授いただけませんでしょうか? どうぞよろしくお願い申し上げます。ありがとうございました。

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、...続きを読む

Aベストアンサー

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。
Me.Close() に変えるとうまくいきました。

通常はどちらでもうまくいきます。

>2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

ShowDialogの場合は、メソッド内部で、ハンドルが破棄されているため、Close()メソッドの際にDispose()メソッドが呼び出されます。

>3. 呼び出し方ではなく、別の要因が存在する

そう思います。

>4. 併記する必要がある場合がある

インスタンスを明示的に破棄したほうがよい場合は多く存在します。
Disposeが使えるメンバはIDisposableをインターフェースとして持っているメンバです。
これらのメンバは、外部とのやり取りを行うものが多くあります。
たとえばSQLClientに含まれるようなメンバです。

外部とのコネクションを確実に破棄を保障してほしいなどという場合がありますよね、このようなときに使用します。

Using構文を使用するのとまったく同じ理由になります。
正確にはUsing構文を使用できるメンバには条件があります、IDisposableをインターフェースとして持っているメンバに限るというものです。

ほかにもガーベージコレクタによるファイナライズを伴うかどうかという違いがあります。
Disposeの場合はファイナライズが同時に行われるため、使用していたメモリ空間を開放することができます。

上記のような理由により、
Me.Close()
Me.Dispose()
は両方書いたほうがよいと思います。

蛇足ですが、
Me.Dispose()
Me.Close()
はエラーになります。
Me.Dispose()により、Me本体(インスタンス)は削除されてしまいます。
存在しないMeに対してCloseメソッドを要求することはできないためです。

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリ...続きを読む

QDataGridViewで指定したセルの値を取得

こんにちは。

VB2008のDataGridViewで指定したセルの値を取得をする方法がわかりません。
どなたか教えてください。

Aベストアンサー

こんばんは.

 Dim Data As String
 Data = Me.DataGridView(0, 2).Value
 MsgBox(Data)

みたいな感じで取れないですかね???

QVB.NETで他のプロジェクトで作成したフォームを使う方法

こんにちは。
VB.NETのプロジェクトがぐちゃぐちゃで参照設定とかいろんなの呼んでしまっているので、新しく作成しなおしたいのですが、
新しいプロジェクトでプロジェクトを作成し、前のプロジェクトで必要なファイル(.vb、RESX)を新しいプロジェクトのフォルダにコピーしたのですが、
普通のモジュールは追加>新しい項目の追加でなんとか追加できたのですが、フォームの追加の仕方がわかりません><教えてくださいー

P.S. RESXファイルってフォームのデータが入ってるのでしょうか?そんな気がしてコピーしたのですが。

※VB6.0からVB.NETに以降した際にアップデート情報みたいなのがプログラム上にくっついてしまって.vbファイルも参照項目も増えまくってしまった

Aベストアンサー

ドラッグ&ドロップが使いやすい。
Windowsのエクスプローラでvbファイルをドラッグして、VS.NETのソリューションエクスプローラへドロップする。

QForm間の値の渡し方

1つのForm上のコマンドボタンで別のFormを表示、そこで変数に値を入れ、そのFormを閉じ、元のFormでその変数を使いたいのですが、どうもうまくいきません。
実施したやり方は、一方のFormの宣言領域で、”Public abc As String”を宣言、両方のFormの(変数に値を入れた方と変数を使う方の)プロシージャーの宣言では引数として(abc As String)と記述しました。
因みに、両プロシージャーともイベントプロシージャーです。何か基本的なことができていないのだとは思いますが、どなたか教えていただけませんか?よろしくお願いします。

Aベストアンサー

すでに何件か回答があがっていますので、少し変わった方法をご参考までに。

あまり使われませんが、Formにはtagというプロパティがあります。
これは「文字列形式であれば何でも格納できる」という、上手く使えば便利なプロパティです。

FormAからFormBを呼び出し、FormBで変更した値をFormA.tagにセットします。
ここでFormBをUnloadしてもFormA.tagの値は影響を受けないので自由に使えます。

複数の値を呼び出し元に戻してやる場合に、区切り文字(カンマなど)で連結した文字列をtagに格納し、呼び出し元で区切り文字でsplitして、複数の値を受け渡すという手法をよく使っています。

QConsole.WriteLine で表示されない

VB2008でプログラムミングしておりますが、プログラミング試験の為によく使われる、「Console.WriteLine」ですが、表示されないのです。
何処に表示されるのでしょうか。
デバックを行っても何処にも表示されません。

Console.WriteLine("Hello World")
でも表示が何処にも有りません。

初歩的な質問ですが、私には大事な一歩なので宜しく御願い致します。

Aベストアンサー

質問者さんはもう見ていないかもしれませんが、一つ。
質問者さんはプロジェクトのタイプをFormにしているので、コンソールに表示されないのです。
プロジェクトのタイプをコンソールアプリケーションにすれば良く見られるDOS窓に表示されます。
Formアプリケーションタイプでも、確かプロジェクトのプロパティをいじればできたはずです。

QVB2010で、時刻と時間の計算について

時刻と時間の計算で、どうするのが最適か教えて下さい。

1…2つの時刻、例えば「08時28分」から「17時04分」までの時間を計算し、Labelにその時間「8時間36分」と表示する

2…3つの時間、例えば「8時間36分」、「6時間08分」、「9時間54分」の合計を計算し、Labelにその合計を表示する

3…上記2番目の平均を計算し、Labelにその平均を表示する

よろしくお願いします。

Aベストアンサー

.net framework 上で "時間" は TimeSpan 型を使う。
DateTime 型どうしの計算をすると、結果は自動的に TimeSpan 型で返ってくる。

(1) 2つの時刻の差
DateTime が "xx時xx分" という値を認識するとは思ってもいなかった。

Dim dt1 As DateTime = DateTime.Parse("08時28分")
Dim dt2 As DateTime = DateTime.Parse("17時04分")
Dim result As TimeSpan = dt2 - dt1
Label2.Text = String.Format("{0}時間{1}分", Math.Floor(result.TotalHours), result.Minutes)


(2) 3つの時間の合計
3つの "時間" とあったので、最初から TimeSpan を使っているが、DateTime であっても問題ないかもしれない。
合計の "時" は TimeSpan 型の Hour で取れるが、24時間を越える場合も "時" の部分しか取れないので TotalHours プロパティを使った。
TotalHours は分秒の値も少数で持っているので切り捨てている。

Dim span1 As TimeSpan = TimeSpan.Parse("8:36:0")
Dim span2 As TimeSpan = TimeSpan.Parse("6:8:0")
Dim span3 As TimeSpan = TimeSpan.Parse("9:54:0")

Dim result As TimeSpan = span1 + span2 + span3
Label4.Text = String.Format("{0}時間{1}分", Math.Floor(result.TotalHours), result.Minutes)


(3) 時間の平均
平均を算出する部分は関数にでもしておけばよいと思う。
今回はサンプル数が 3つなのでベタに書いている。
時間の合計から TotalMinutes で分に直した値で平均値を出して、それを FromMinutes で TimeSpan 型に戻している。

Dim span1 As TimeSpan = TimeSpan.Parse("8:36:0")
Dim span2 As TimeSpan = TimeSpan.Parse("6:8:0")
Dim span3 As TimeSpan = TimeSpan.Parse("9:54:0")

Dim totalValue As Double = span1.TotalMinutes + span2.TotalMinutes + span3.TotalMinutes
Dim averageMinutes As Double = Math.Floor(totalValue / 3)
Dim result As TimeSpan = TimeSpan.FromMinutes(Math.Floor(averageMinutes))
Label6.Text = String.Format("{0}時間{1}分", Math.Floor(result.TotalHours), result.Minutes)

.net framework 上で "時間" は TimeSpan 型を使う。
DateTime 型どうしの計算をすると、結果は自動的に TimeSpan 型で返ってくる。

(1) 2つの時刻の差
DateTime が "xx時xx分" という値を認識するとは思ってもいなかった。

Dim dt1 As DateTime = DateTime.Parse("08時28分")
Dim dt2 As DateTime = DateTime.Parse("17時04分")
Dim result As TimeSpan = dt2 - dt1
Label2.Text = String.Format("{0}時間{1}分", Math.Floor(result.TotalHours), result.Minutes)


(2) 3つの時間の合計
3つの "時間" とあった...続きを読む

QVB上で実行中の無限ループの止め方

今まで、CUIベースのBASICでのプログラムの経験はあるのですが
Visual系のBASICは初心者です。
原因はわかっているのでプログラムの修正はできるのですが
VB上でコンパイルして実行したときに無限ループに陥ってしまって
どうにもプログラムをとめられなくなります。
そんなことがないように、実行前に全てのプロジェクトを保存して
いますので、そんなに実害はないのですが、どうすればとめられるのでしょう・・
今現在は、タスクマネージャーから強制終了させています。

Aベストアンサー

無限ループの一番内側に
DoEvents
を入れておくと、ウィンドウ切替え->デバッガ終了操作が出来ますよ

危なそうなとこにも入れておくと、何かと安心です。

QVB.NETでのイベントの途中終了

VB.NETで、あるボタン(button1)をクリックさせた際にイベントを発生させます。

そのイベント内の処理途中で、イベントを終了させたいと思っていますが、どのように書いていいかわからず困っています。

どなたかおわかりの方お願いします。

Aベストアンサー

Exit ←これをイベント終了したいところで、使えばいいと思いました。

(例)
Private Sub Button1_Cilck・・・省略・・・
 '「Button1」をクリックしたときのイベント
 If Msgbox("イベントを途中終了しますか?",vbYesNo) = vbYes Then
  Exit Sub 'イベント途中終了
 End If
 Msgbox("イベントを途中終了しませんでした。")
End Sub

QVB.NETのコンボボックスについて

VB6からVB.NETでプログラミングを始めました。
コンボボックスのクリアの仕方や設定の仕方、また
取り出し方等を教えて下さい。

色々とヘルプも見てみたのですが、よく解りません。
宜しくお願い致します。

Aベストアンサー

クリアだけだと思ってました。
追記します。

Itemを操作します


'登録
For i = 1 To 10
  Me.ComboBox1.Items.Add(i.ToString)
Next

'取得
For i = 0 To Me.ComboBox1.Items.Count - 1
  MsgBox(Me.ComboBox1.Items(i).ToString)
Next

'完全クリア
Me.ComboBox1.Items.Clear()

部分クリア
Me.ComboBox1.Items.RemoveAt(Index値)


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

人気Q&Aランキング

おすすめ情報