プロが教えるわが家の防犯対策術!

教えてください。
VBで時間の足し算をしたいのですが、方法が分かりません。
例えば、毎日の通信時間の合計を出したい場合ですが、
00:15:30(15分30秒)
00:45:31(45分31秒)
の日があったとします。
この合計は01:01:01(1時間1分1秒)になると思います。この計算ができずに困っています。
教えて頂けないでしょうか。

A 回答 (6件)

こんばんは。



ヘルプに書いてありましたね。
演算子(\)

  除算を実行する前に、数式はバイト型 (Byte)、整数型 (Integer)、また
  は長整数型 (Long) の式に丸められます。

となっていましたね。うっかりしていました。

これは負の値がないのなら、単に、Int(Sum) で大丈夫のような気もしますね。

しかし、今、気が付いたのですが、
>毎日の通信時間の合計を出したい場合ですが、
>00:15:30(15分30秒)
>00:45:31(45分31秒)

累積時間の計算でしたら、私の前回のコードはダメですね。エラーが発生します。全面的に見直しました。

いくら、その都度計算していっても、累積時間だから、以下のような結果もありますね。時間(hour)は、時間(hour)だけの計算にしました。

 "25:15:40"
 "28:45:31"
 ----------
 "54:01:11"

Sub TimeCalc()
 Dim myTime1 As String, myTime2 As String
 Dim ans As String

 myTime1 = "09:15:30"
 myTime2 = "08:45:31"
 
 ans = TimeSum(myTime1, myTime2)

 MsgBox ans
End Sub
Private Function TimeSum(ByVal arg1 As String, ByVal arg2 As String) As String
 Dim h1 As Long, h2 As Long, t1 As String, t2 As String
 Dim Sum As Double, d As Long, h As Long, dh As Long
 Dim m As Long, s As Long
 
 h1 = Mid(arg1, 1, InStr(arg1, ":") - 1)
 t1 = "00:" & Mid$(arg1, InStr(arg1, ":") + 1)
  
 h2 = Mid(arg2, 1, InStr(arg2, ":") - 1)
 t2 = "00:" & Mid$(arg2, InStr(arg2, ":") + 1)
 
 If h1 + h2 > 23 Then
  d = Int((h1 + h2) / 24)
  dh = (h1 + h2) Mod 24
 Else
  dh = h1 + h2
 End If
  Sum = CDbl(TimeValue(t1)) + CDbl(TimeValue(t2))
  h = Hour(Sum): m = Minute(Sum): s = Second(Sum)
  h = d * 24 + dh + h
  TimeSum = Format$(h, "00") & ":" & Format$(m, "00") & ":" & Format$(s, "00")
End Function
    • good
    • 0
この回答へのお礼

ありがとうございました。
なんとか作成することができました。
助かりました。

お礼日時:2005/07/15 14:44

#4での自己発言についての調査結果


>18:01:01 = 0.750706018518519 (Double型)
>なのに1が入るのが不思議(もしやバグ?)


\ 演算子について

構文
結果 = 数式1 \ 数式2

仕様
数式1 と 数式2 は除算を実行する前に[Byte/Integer/Long]のいずれかに丸められる




0.750706018518519 \ 1
だから
1 \ 1
が計算される


ということで、バグではなかったようです。

だから計算の際は、切捨て必須!
    • good
    • 0

#1もしくは#2です。



18:01:01 = 0.750706018518519 (Double型)
なのに1が入るのが不思議(もしやバグ?)

なら切捨てを実行したらいいです。


lng日数 = inDate \ 1

lng日数 = CLng(inDate - 0.5)
    • good
    • 0

こんばんは。


こんな風でいかがでしょうか?
単純なコードにしてみました。
元に時間の入れ方などは、お任せします。

Option Explicit
Sub TimeCalc()
 Dim myTime1 As String, myTime2 As String
 Dim a As Double, b As Double, Sum As Double
 Dim d As Long, h As Long, m As Long, s As Long
 
 myTime1 = "00:15:30"
 myTime2 = "23:45:31"
 
 a = CDbl(TimeValue(myTime1)): b = CDbl(TimeValue(myTime2))
 Sum = a + b
 
 d = Sum \ 1: h = Hour(Sum): m = Minute(Sum): s = Second(Sum)
 d = d * 24
 
 MsgBox Format$(d + h, "00") & ":" & Format$(m, "00") & ":" & Format$(s, "00")
End Sub

この回答への補足

回答ありがとうございます。
遅くなってすみません。

myTime1 = "09:15:30"
myTime2 = "08:45:31"

とかの場合に
d = Sum \ 1
でSumの値が1になります。すると、
Format$(d + h, "00")
が24+18で42となってしまいます。
この場合計算が合わないのですが、どうすればいいのでしょうか。

何度もすいませんがご教授お願い致します。

補足日時:2005/07/14 16:53
    • good
    • 0

日付を時間に変えたらいいだけですよー




Sub Main()
  Dim dateWk As Date
  Dim str結果 As String
  
  '足し算
  dateWk = Calc日付合算("12:01:05", "13:01:05")
  dateWk = Calc日付合算(dateWk, "14:09:20")
  dateWk = Calc日付合算(dateWk, "16:01:59")
  Call MsgBox("取得結果: = " & dateWk)
  
  '変換
  str結果 = Convert日付から時刻型(dateWk)
  Call MsgBox("最終結果: = " & str結果)
End Sub

Function Convert日付から時刻型(ByVal inDate As Date) As String
  Dim lng日数 As Long
  Dim dbl時間 As Date
  
  '日付と時刻に分割
  lng日数 = inDate \ 1
  dbl時間 = inDate - lng日数

  '書式を整理して返却(あんまり大きいとオーバーフローしちゃう)
  Convert日付から時刻型 = (lng日数 * 24 + Hour(dbl時間)) & Mid(dbl時間, Len(Hour(dbl時間)) + 1)
End Function

Function Calc日付合算(ByVal inStrDate1 As String, ByVal inStrDate2 As String) As Date
  Calc日付合算 = CDate(CDate(inStrDate1) + CDate(inStrDate2))
End Function
    • good
    • 0

MSGBOX CDate("00:15:30") + CDate("00:45:31")

この回答への補足

ありがとうございます。
この場合、24時間を超えるとまた0に戻ってしまうのですが、そのときの処理はどうすればいいのでしょうか。
何度もすみませんが、教えて頂けないでしょうか。
お願いします。

補足日時:2005/07/12 17:40
    • good
    • 0

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