カウントダウンさせるプログラムを作っているのですが、「Timer」を使用して「1秒毎」にカウントダウンさせていきたいんですけど「テキスト」内の数値を[0・・59・・58・・」の順にカウントさせることは可能ですか?
現時点では「Timer」を設置してボタン操作でカウントを始めるプログラムを書きましたが、どうも計算がうまくいきません。
Public Class Form1
Private SecCount As Integer ' 秒数をカウントする整数
Private Count As Integer
Private WaitSecond As Integer ' タイマーの停止時間を秒単位で記憶する変数
' [START]ボタンを押した時に実行する処理
Private Sub DoConvert(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
Dim WorkingMinute, WorkingSecond As Integer
Dim WorkingHour As Integer
Dim Smhplass As Integer ' 時間をカウントする変数
' 入力された時間と分と秒を数値に変換
WorkingHour = numHour.Value
WorkingMinute = numMinute.Value
WorkingSecond = CInt(txtSecond.Text)
' 指定されたタイマーを秒単位で記憶
WaitSecond = WorkingHour * 60 + WorkingMinute * 60 + WorkingSecond
' 指定されたタイマー停止時間が 0 秒のときは開始処理をキャンセル
If WaitSecond = 0 Then
Exit Sub
End If
' 秒数のカウントと表示をテキスト内の表示にに初期化
SecCount = WorkingHour + WorkingMinute
Count = 0
' カウンターを処理する変数
Smhplass = WorkingSecond + WorkingMinute + WorkingHour
' numからテキストに表示
txtHour.Text = WorkingHour.ToString()
txtMinute.Text = WorkingMinute.ToString()
' [START]ボタンを無効化
btnStart.Enabled = False
' タイマーを開始
Timer1.Start()
' 表示画像の変更
lblStandby.Text = "START"
End Sub
' 指定したミリ秒毎に実行される処理
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Dim Smhplass As Integer ' 時間をカウントする変数
Dim WorkingHour, WorkingMinute, WorkingSecond As Integer
' テキストをIntに変える変数
WorkingHour = CInt(txtHour.Text)
WorkingMinute = CInt(txtMinute.Text)
WorkingSecond = CInt(txtSecond.Text)
' カウンターを処理する変数
Smhplass = WorkingHour - WorkingMinute - WorkingSecond
' タイマーカウント行う処理
SecCount = SecCount - 1
Smhplass = SecCount
If SecCount = WaitSecond Then
' 表示画像を変更
lblStandby.Text = "STANDBY"
' タイマーを停止
Timer1.Stop()
' [START] ボタンを有効化
btnStart.Enabled = True
End If
End Sub
End Class
上記がボタンを押した時の処理とタイマーイベント(Tick)が行う処理の記述のつもりなのですが、ここからどういう計算方式で「0・・59・・58」の順に減らしていくのかわかりません(ι・_・)
デザインではテキストが「時間・分・秒」の順に表示される様に設定しています、そこに表示させたテキストの「分・秒」を先ほどの計算式で逆算していきたいです。
たとえば1時間に設定したら「秒」のカウントは「59」から始まり「分」はそれに伴って秒が60カウントをした「1分」ずつ減っていくような感じです。
Name設定を変えているのでボタンやテキストの表記が多少変わっていて読みにくいかもしれませんが「ボタン」なら「btn~」、テキストなら「txt~」で名前をつけています。
長くなってしまいましたが、もしいい方法があれば是非ご伝授の方よろしくお願いします。
No.2ベストアンサー
- 回答日時:
btnStartのClickイベントを
btnStart.Enabled = False
tm = Now.AddHours( numHour.Value )
tm = tm.AddMinits( numMinute.Value )
ts = Now - tm
txtHour.Text = ts.Hours.ToString()
txtMinuts.Text= ts.Minuts.ToString()
txtSecond.Text = ts.Second.ToString()
Timer1.Enabled = True
とします ・・・ 他の部分はコメントアウトしておくなどしましょう
Timer1のTickイベントを
ts = tm - now
txtHour.Text = ts.Hours.ToString()
txtMinuts.Text= ts.Minuts.ToString()
txtSecond.Text = ts.Second.ToString()
if ts.TotalSeconds < 1 then
Timer1.Enabled = False
btnStart.Enabled = True
end if
とします ・・・ Clickイベント同様に他の部分はコメントアウト
dim ts as TimeSpan, tm as DateTime
を『Public Class Form1』の次の行ぐらいに記述します
といった具合でどうでしょう
Nowは VBの組み込みプロパティで .NETのオブジェクトでいうと
DateTime.Nowになります
tm = Now.AddHours( numHour.Value )
は 現在に時刻に numHourの値を時間として加えた時刻を tmに代入することになります
19:00に numHourが2だった場合 21:00が設定されます
tm = tm.AddMinutes( numMinute.Value )
は tmの時刻に numMinuteの値を分として加算した値を tmに再設定します
21:00に numMinuteが30だった場合 21:30をtmに設定します
ts = tm - Now
はClickイベントで設定されたカウントダウン完了時刻(tm)から現在の時刻を減算した結果を取得します
TimeSpan型には時間の24進や分、秒の60進の計算を内部でしてくれるので HoursやMinutes,Secondsなどで時、分、秒を簡単に取得できます
また TotalSecondsで秒単位での取得も可能です
TotalSecondsが1未満ということは予定したカウントダウンが終了したということになります
MSDNなどで わからないプロパティやオブジェクトは検索するようしましょう
参考URL:http://msdn.microsoft.com/ja-jp/library/system.d …
返事遅れてしまいました、申し訳ございません!!
この回答に記載されているプログラムを試しましたところ、無事にカウントさせることができました☆
ありがとうございます。とてもわかりやすい説明をして頂き感謝しています。
アドバイスも参考にさせていただきます、何から何まで本当にありがとうございました。
重ねて御礼申し上げます。わがままを言ってしまい申しわけありませんでした。
ではこれで失礼いたします。
No.1
- 回答日時:
こんなに複雑にしなくてもいいように思いますよ
TimeSpanクラスを使ってやればいいでしょう
クラスのグローバル変数として
dim ts as TimeSpan, tm as DateTime
を宣言しておきます
btnStartのClickイベントで
btnStart.Enabled = False
' 1時間なら
tm = now.AddHours(1)
ts = tm - now
txtHour.Text = ts.Hours
txtMinuts.Text= ts.Minuts
txtSecond.Text = ts.Second
Timer1.Enabled = True
Timer1のTickイベントで
ts = tm - now
txtHour.Text = ts.Hours.ToString()
txtMinuts.Text= ts.Minuts.ToString()
txtSecond.Text = ts.Second.ToString()
if ts.TotalSeconds < 1 then
Timer1.Enabled = False
btnStart.Enabled = True
end if
といった具合で ・・・
この回答への補足
先ほどのつづきですm(_ _)m
プログラムは始めたばかりなので、「Now.AddHours(1)」など見たことのない記述が目に入ったのですが、「Now」は日本語に直すと「現在」ですから、「tm = 現在時間を1づつ上げていく値」「ts = 1ずつ上がっていく値 - 現在時刻」
という風な解釈をしているのですが、式によって「=」は代入するものと等しいものと分かれていると聞きました。
その辺の区別がまだあまりつかない状態ですが、教えて頂いた「TimeSpanクラス」を使用するにあたって最初に投稿した記述からいらない値や変数がありましたらお時間のあるときにでもご指導していただけたらありがたいです。
フォームのデザインは上から「TextBoxが横ならびで3つ(時間・分・秒を表すBoxです)」とそのすぐ下に「NumericUpDownが横ならびで二つ(ここで指定した時間をTextBoxに表示される様にしています)」とその下にスタートボタンがあります。
長々と書いてしまって、本当にすいませんm(_ _)m
回答ありがとうございました。
早速回答ありがとうございますm(_ _)m
一応試してみたのですが、元の値をいじりすぎてこんがらがってしまいます(汗
Clickイベントの(' 指定されたタイマーを秒単位で記憶
WaitSecond = WorkingHour * 60 + WorkingMinute * 60 + WorkingSecond)やTickイベントの(' タイマーカウント行う処理
SecCount = SecCount - 1
Smhplass = SecCount)などの変数は残したまま記述しても問題ないでしょうか?
ちなみに教えて頂いた記述を入力した箇所ですが「dim ts as TimeSpan, tm as DateTime」は「Public Class Form」のすぐ下に記述しました。
その上で「btnStart」のClickイベントで「btnStart.Enabled = False」のすぐ下から↓
' 1時間なら
tm = now.AddHours(1)
ts = tm - now
txtHour.Text = ts.Hours
txtMinuts.Text= ts.Minuts
txtSecond.Text = ts.Seconds
Timer1.Enabled = True
を記述しました。
Timer1のTickイベントには回答くださった式をイベント内の適当な場所に記述しました。
・・がうまく作動しませんでした。多分いろんな式が混ざってしまっているので誤作動を起こしているのだと思います。
長くなりますので別のフォームでつづきを書かせて頂きます。申し訳ありませんm(_ _)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) 九九の答えの計算 3 2022/12/20 22:13
- Visual Basic(VBA) ユーザーフォーム「frm_基本❶」を立ち上げると新規で入力する行数を右下のNoとして表示しています。 1 2023/03/16 19:02
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) エクセルのマクロについて教えてください。 7 2023/07/04 09:18
- Visual Basic(VBA) VBAで質問ですが、皆さんはどの様に導き出しているのでしょうか? 6 2022/05/03 21:53
- Visual Basic(VBA) Visual Basic : ImageListの画像がそろったときにメッセージを表示 1 2023/07/20 13:53
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
スタティックテキストが表示さ...
-
VBA、UserFormを前面に出力して...
-
ACCESS側からEXCELの書式を設定...
-
【C#】 あるイベントから別イ...
-
VBSで応答不要のメッセージボッ...
-
InvalidateRectがうまくいかない
-
マウスのクリックを無視したい
-
メッセージボックスのボタン名変更
-
VBA kernel32 の意味
-
起動後直に実行するコードはど...
-
Excel VBA 自動的に閉じるMsgBox
-
WEB上にボタンが押せない
-
DirectX環境下での方向キー同時...
-
VB.NET開発(イベントプロシー...
-
スケジューリング方式
-
VBSの処理中一旦処理を止めて再...
-
MFCのView終了時の終了確認
-
VCでウエイトをミリ秒でかけ...
-
VBA メッセージボックスを自動...
-
Application.ScreenUpdating=Fa...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
メッセージボックスのボタン名変更
-
VBSの処理中一旦処理を止めて再...
-
VBSで応答不要のメッセージボッ...
-
ACCESS側からEXCELの書式を設定...
-
VBA メッセージボックスを自動...
-
Application.ScreenUpdating=Fa...
-
VBA kernel32 の意味
-
エクセルVBAでクリップボード内...
-
Excelのワークシートに行を挿入...
-
Excel VBA で処理中断(DoEvents...
-
【C#】 あるイベントから別イ...
-
手動かプログラムでの起動かの判断
-
ASP.NETでのメッセージ画面を出...
-
Excel VBA 自動的に閉じるMsgBox
-
シャットダウン時のExcel強制終...
-
VBA、UserFormを前面に出力して...
-
<input type="file">タグで「キ...
-
Excel VBA 実行中に一瞬フリー...
-
「キャンセル」ボタン付きの処...
-
EXCEL VBA「Application.Displa...
おすすめ情報