- ベストアンサー
時間計算について
いつもお世話になっております。 今回の内容は私にとってとても厄介で是非皆様のお力を お借りしたいと思っているのですが。 さて内容です。 項目 「設定時間」・・・「秒」単位:3桁 「処理数」・・・・処理する数:6桁 「設定時間」×「処理数」で、総時間(秒)を割り出し ます。 「開始時間(時:0~23)」・・・Comboboxで手入力。 「開始時間(分:00~30)」・・・Comboboxで手入力。 (どちらもランダムで設定可能。) 「終了時間(時)」 「終了時間(分)」 この2項目に開始時間に上記の計算で割り出した総時間を加算した結果を表示させたいのですが。。。 力量不足でどうにも思いつきません。 よろしくお願いします!
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
関数ってなに?・・・っていう無垢なころに以下の方法でムリヤリ作ったことあります(Excelで) 入力は現状のままで(内部計算時に)時刻を秒表現に換えて計算します。 時刻表現 秒表現 00時00分00秒 = 0秒 00時00分01秒 = 1秒 ・ ・ 23時59分59秒 = 86399秒 内部に対応テーブルを設けて走査してもいいですが、せっかくですからプログラムらしく 計算で求めてみます^^;。 手順は、 a 総時間数を秒表現 b 開始時刻を秒表現 (時*60*60)+(分*60)+(秒) c a+b d cを時刻表現に戻す (a) c / 86400 の商を「日」 (b) (a)の余り / (60*60) の商を「時」 (c) (b)の余り / (60) の商を「分」 (d) (c)の余り を「秒」 end sub (ex 設定時間 = 999秒 処理数 = 999999 開始時刻 = 12時15分30秒 a 999 * 999999 = 998999001秒 b (12時*60*60)+(15分*60)+(30秒)= 44130秒 c a+b = 999043131 d (a) 999043131 / 86400 = 11562「日」あまり86331 (b) 86331 / (60*60) = 23「時」あまり3531 (c) 3531 / (60) = 58「分」あまり51 (d) 51「秒」 終了時刻 : 「11562日後の23時58分51秒」 検算してませんので数字に間違いがあったらごカンベン・・・ 全てのケースで検証してませんので十分テストして手順に誤りがあったら教えてくださいぜひ^^; メリットがあるとすれば、手順を紙に書いておくことで、何らかの理由で関数が使えない環境下でも計算可能です。(システムダウン時の手計算とか(冷汗)
その他の回答 (4)
- todo36
- ベストアンサー率58% (728/1234)
DATE型でやるならこんな感じ Dim d As Date d = DateAdd("s", 999 * 999999, CDate("12:15:30")) MsgBox CInt(d) & "日後の" & Format(d, "hh:mm:ss") 個人的には#2の方法がわかりやすいと思います。
お礼
アドバイス、ありがうございます。 そうですね、私もそう思っています。 またつまづきようでしたら、ご質問させて頂きますので 是非よろしくお願いします!(ご回答くださったみなさんも。)
- SpiralGalaxy
- ベストアンサー率39% (649/1654)
例えば 2003/03/25 12:34 の n秒後の年月日時分秒を求めるとすると ボクはC++使い(MFC)なのでC++だと CTime t1 = new CTime(2003,3,25,12,25,0); CTime t2 = new CTime(t1.getTime() + (n * 1000)); という2行で計算できます。 VisualBasic カテゴリなのでこれに当てはまるようなコーディングを考えると Dim ddd As Date ddd = DateAdd("s", n, CDate("2003/03/25 12:34:00")) この一行でできないでしょうか。僕は VisualBasic は全くできません。ただヘルプをみて推測しただけですが、他の方フォローしてくだされば幸いです。 C++は本職なので専門家にさせていただきました(^^;
お礼
なるほど、私は逆にC++は全く分かりませんが(時間計算も経験ありませんが。。。)、アドバイス、ありがとうございます!
- TAGOSAKU7
- ベストアンサー率65% (276/422)
気になったので発言 時間計算の余りを算出するときの基本 「/」ではなく 「¥」を使用 あと参考までに Debug.Print 60 * 60 * 24 だと、オーバー風呂します Intの計算として扱われます。 Debug.Print 60& * 60& * 24& として、Longを明示するとオーバー風呂いたしません。 あ~いい~湯加減w
お礼
ありがとうございます。 参考にさせていただきます。
以下の関数を使用すれば実現可能です。 TimeSerial DateDiff Hour Minute Second 注意点ですが、日付を跨ぐ場合、日付の情報がないと、正しい時間計算ができません。 その場合、 DateSerial DateDiff Year Month Day の各関数も調べておいた方がよいでしょう。 大きなお世話かもしれませんが、 「開始時間」、「終了時間」は、それぞれ、 「開始時刻」、「終了時刻」の方が適切では?
お礼
大変分かりやすいご説明、ありがとうございます。 さっそく活用してみます。 。。。「時刻」に修正します。 ご指摘ありがとうございます。
お礼
非常にご丁寧なご回答、大変感謝しています。 nao_2さんの方法だと、分かりやすいですね。 是非参考にさせて頂きます。