tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトル時間(??分??秒)を合算するには?
記事No12530
投稿日: 2008/06/15(Sun) 18:37
投稿者tea
選手(18名)の出場時間(??分??秒)を合算して
合計時間を表示するにはどうしたら良いのでしょうか?

以下のようにコードを記述してみましたが、正しい合計
時間が表示されませんでした。

基本的な事柄かもしれませんが、教えてください。
よろしくお願いします。

Private Function GameTimes(ixTeam As Long)
Dim i As Integer

    For i = 1 To bbPlayerMax
        With Game.Team(ixTeam).Player(i)
            GameTimes = Format(GameTimes, "mm:ss") + _
            Format(.PlayTime, "mm:ss")
        End With
    Next
End Function

[ツリー表示へ]
タイトルRe: 時間(??分??秒)を合算するには?
記事No12531
投稿日: 2008/06/15(Sun) 21:00
投稿者tea
>             GameTimes = Format(GameTimes, "mm:ss") + _
>             Format(.PlayTime, "mm:ss")

上記は間違いですね。

             GameTimes = Format(GameTimes, "nn:ss") + _
             Format(.PlayTime, "nn:ss")

とmをnに変更しましたが、依然として時間の合算が出来ません。
どうかよろしくお願いします。

[ツリー表示へ]
タイトルRe^2: 時間(??分??秒)を合算するには?
記事No12532
投稿日: 2008/06/15(Sun) 21:35
投稿者nobu
> とmをnに変更しましたが、依然として時間の合算が出来ません。

単に時間の合計と言う算数の問題なのでは?


1分は60秒、1時間は60分、1時間は3600秒....
時間、分を全て秒に直してから合計をして
求められた秒は分にして、時間にしてと言う単純計算を
すれば済む話ではないでしょうか?
まずは一人の計算が正確に出来る様にしてから
18人分の処理をして下さい。

[ツリー表示へ]
タイトルRe^2: 時間(??分??秒)を合算するには?
記事No12535
投稿日: 2008/06/16(Mon) 06:27
投稿者花ちゃん
> とmをnに変更しましたが、依然として時間の合算が出来ません。
> どうかよろしくお願いします。

ここの日付・時刻・関係はご覧になったのですか?

# いつも同じような事を繰り返しておられるような、過去のご自分の質問と
 他の方の回答を今一度読み返して見て下さい

[ツリー表示へ]
タイトルRe^3: 時間(??分??秒)を合算するには?
記事No12536
投稿日: 2008/06/16(Mon) 08:22
投稿者tea
nobuさん、花ちゃんさん、回答をいただきまして本当
にありがとうございます。

> ここの日付・時刻・関係はご覧になったのですか?

事前に見ましたが、よくわからなかったので質問しました。
これから再度読み直してみます。

[ツリー表示へ]
タイトルRe^4: 時間(??分??秒)を合算するには?
記事No12537
投稿日: 2008/06/16(Mon) 09:07
投稿者花ちゃん
> 事前に見ましたが、よくわからなかったので質問しました。

どこのどの部分が解らなかったのでしょうか? その辺を書いて頂かないと
説明のしようもないので。

貴方は、時間の計算(足し算)を電卓で計算する場合どのようにして計算されるの
でしょうか?
それをコードに表せばいいのでは。

[ツリー表示へ]
タイトルRe^5: 時間(??分??秒)を合算するには?
記事No12546
投稿日: 2008/06/16(Mon) 16:22
投稿者tea
花ちゃんさん、回答をしていただき本当にありがとうございます。

自分なりにコードを以下のように記述しました。
現状では合算でMSの値は56.25となり、時間に変換すると
計56分15秒となります。

ただ、56.25から56:15にする方法がわかりません。
整数と小数点以下に分離して、少数点以下に60を掛けると
「15秒」となることはわかっていますが、どうコードにし
ていけばいいのかがわかりません。

どうか教えてください。
よろしくお願いします。

Private Function GameTimes(ixTeam As Long)
Dim i As Integer
Dim m As Long
Dim s As Long
Dim t As Long
Dim TotalSecond As Long
Dim MS As String

    For i = 1 To bbPlayerMax
        With mp.Game.Team(ixTeam).Player(i)
            '分
            s = Hour(.PlayTime)
            '分を秒に
            s = s * 60
            '秒
            t = Minute(.PlayTime)
            
            '秒の合計
            m = s + t
            
            '秒の合算
            TotalSecond = TotalSecond + m
            
            '合算した秒を分秒形式に変換
            MS = TotalSecond / 60
            
            GameTimes = MS
        End With
    Next
End Function

[ツリー表示へ]
タイトルRe^6: 時間(??分??秒)を合算するには?
記事No12547
投稿日: 2008/06/16(Mon) 16:44
投稿者
>             '合算した秒を分秒形式に変換
>             MS = TotalSecond / 60

上記がおかしいですね。
"分:秒"を"秒"に変換した時は

 分 * 60 + 秒

としたんですから、その"秒"を"分:秒"に戻す時は逆のことをすれば…

[ツリー表示へ]
タイトルRe^7: 時間(??分??秒)を合算するには?
記事No12550
投稿日: 2008/06/16(Mon) 17:15
投稿者tea
> としたんですから、その"秒"を"分:秒"に戻す時は逆のことをすれば…

琴さん、回答をいただき本当にありがとうございます。
以下のように書き加えましたが、合計時間は意図した通りに「56:15」
と出ました。
このコードでいいんでしょうか?

Private Function GameTimes(ixTeam As Long)
Dim i As Integer
Dim m As Long
Dim s As Long
Dim t As Long
Dim TotalSecond As Long
Dim MS As String
Dim TotalTime As String

    For i = 1 To bbPlayerMax
        With mp.Game.Team(ixTeam).Player(i)
            '分
            s = Hour(.PlayTime)
            '秒
            t = Minute(.PlayTime)
            
            '分を秒にして秒の合計
            m = s * 60 + t
            
            '秒の合算
            TotalSecond = TotalSecond + m
            
            '合算した秒を分秒形式に変換
            MS = TotalSecond / 60
            
            '分:秒に変換
            TotalTime = Left(MS, 2) & ":" & Right(MS, 3) * 60
            
            GameTimes = TotalTime
        End With
    Next
End Function

[ツリー表示へ]
タイトルRe^8: 時間(??分??秒)を合算するには?
記事No12554
投稿日: 2008/06/17(Tue) 09:10
投稿者
>             '分:秒に変換
>             TotalTime = Left(MS, 2) & ":" & Right(MS, 3) * 60

それだとMSが999以下だったり、10000以上だった場合におかしくなっちゃいますよ。
Mod演算子について調べてみてください。

[ツリー表示へ]
タイトルRe^9: 時間(??分??秒)を合算するには?
記事No12556
投稿日: 2008/06/17(Tue) 14:05
投稿者tea
> それだとMSが999以下だったり、10000以上だった場合におかしくなっちゃいますよ。
> Mod演算子について調べてみてください。

琴さん、回答をいただき本当にありがとうございます。
Modは余剰を求めるものということは理解できました。
以下のようにコードを書き直して見ました。
合計時間は前回の結果と同じなんですがコレでいいんでしょうか?
教えてください。
よろしくお願いします。

Private Function GameTimes(ixTeam As Long)
Dim i As Integer
Dim m As Long
Dim s As Long
Dim t As Long
Dim TotalSecond As Long
Dim MS As String
Dim NS As String
Dim TotalTime As String

    For i = 1 To bbPlayerMax
        With mp.Game.Team(ixTeam).Player(i)
            '分
            s = Hour(.PlayTime)
            '秒
            t = Minute(.PlayTime)
            
            '分を秒にして秒の合計
            m = s * 60 + t
            
            '秒の合算
            TotalSecond = TotalSecond + m
            
            '合算した秒を分秒形式に変換
            MS = TotalSecond / 60
            NS = TotalSecond Mod 60
            
            '分:秒に変換
            TotalTime = Left(MS, 2) & ":" & (NS / 60) * 60
            
            GameTimes = TotalTime
        End With
    Next
End Function

[ツリー表示へ]
タイトルRe^10: 時間(??分??秒)を合算するには?
記事No12558
投稿日: 2008/06/17(Tue) 14:18
投稿者いな
> 合計時間は前回の結果と同じなんですがコレでいいんでしょうか?
> 教えてください。
> よろしくお願いします。

自分で作成しているプログラムのチェックが自分で出来ないことにそもそも
問題があるのでは?と思いました。

作成する前に、何が出来れば問題ないのか?が洗い出せていますか?
プログラムを作成する前に、そのあたりのポイントを抑えられては?

[ツリー表示へ]
タイトルRe^11: 時間(??分??秒)を合算するには?
記事No12559
投稿日: 2008/06/17(Tue) 14:37
投稿者tea
> 作成する前に、何が出来れば問題ないのか?が洗い出せていますか?
> プログラムを作成する前に、そのあたりのポイントを抑えられては?

いなさん、回答をいただき本当にありがとうございます。
何年やっても初心者からから抜け出せないんです・・・。
すいません。

コードを以下のように直してみました。
Private Function GameTimes(ixTeam As Long)
Dim i As Integer
Dim m As Long
Dim s As Long
Dim t As Long
Dim TotalSecond As Long
Dim MS As String
Dim NS As String
Dim TotalTime As String

    For i = 1 To bbPlayerMax
        With mp.Game.Team(ixTeam).Player(i)
            '分
            s = Hour(.PlayTime)
            '秒
            t = Minute(.PlayTime)
            
            '分を秒にして秒の合計
            m = s * 60 + t
            
            '秒の合算
            TotalSecond = TotalSecond + m
            
            '合算した秒を分秒形式に変換
            MS = TotalSecond / 60
            NS = TotalSecond Mod 60
            
            '分:秒に変換
            TotalTime = Fix(MS) & ":" & NS
            
            GameTimes = TotalTime
        End With
    Next
End Function

[ツリー表示へ]
タイトルRe^12: 時間(??分??秒)を合算するには?
記事No12563
投稿日: 2008/06/17(Tue) 23:31
投稿者Renard
取り敢えず、つっこみ希望の投稿と勝手に判断します。

まず、投稿初期からの疑問
 .PlayTimeプロパティにどんな型のどんな値が格納されているのでしょうか?

> コードを以下のように直してみました。
> Private Function GameTimes(ixTeam As Long)
 ↑関数として定義しているのであれば、戻り値の型は明示しましょう。
> Dim i As Integer
> Dim m As Long
> Dim s As Long
> Dim t As Long
> Dim TotalSecond As Long
> Dim MS As String
> Dim NS As String
> Dim TotalTime As String
>
>     For i = 1 To bbPlayerMax
>         With mp.Game.Team(ixTeam).Player(i)
>             '分
>             s = Hour(.PlayTime)
         ↑何故「時間」を返す関数で「分」が求まるの?
>             '秒
>             t = Minute(.PlayTime)
         ↑何故「分」関数で秒が求まるの?
>            
>             '分を秒にして秒の合計
>             m = s * 60 + t
>            
>             '秒の合算
>             TotalSecond = TotalSecond + m
>            
>             '合算した秒を分秒形式に変換
>             MS = TotalSecond / 60
       ↑↓数値計算の結果を文字列変数に入れるのはどうなんでしょう?
>             NS = TotalSecond Mod 60
>            
>             '分:秒に変換
>             TotalTime = Fix(MS) & ":" & NS
             ↑Fix関数の引数に文字列??
>            
>             GameTimes = TotalTime
       ↑For文の外で1回実行すればいいのでは?
>         End With
>     Next
> End Function

あと、「/」演算子ではなく、「\」演算子で商を求める方法もあります。

[ツリー表示へ]
タイトルRe^13: 時間(??分??秒)を合算するには?
記事No12564
投稿日: 2008/06/18(Wed) 10:01
投稿者るしぇ
>まず、投稿初期からの疑問
> .PlayTimeプロパティにどんな型のどんな値が格納されているのでしょうか?
日付処理関数に利用してるし、日付型なんだろうと思うけど、
# 型がめちゃくちゃだから文字列型だったりしそうで怖いですがw
実はそんな問題じゃなくって、
>With mp.Game.Team(ixTeam).Player(i)
mp って何型?Game って何型?Team って何型?Player って何型?ってことで
しかも、結論から言えば質問と関係ない内容でしょ?ってこと。
質問者が Renard さんの書込みに対する説明をする上で
『日付型です』とかしか言えないなら、状況を理解して無いということでしょう。

他人に質問する上で、自分しか分からない言葉を使う時点でアウト。
日常会話でも同じはずです。

DateAdd 関数や DateDiff 関数のように他に依存しない関数を作るべき
なんだろうけど、まぁ。。。同じ事を繰り返してますからねぇ。
型を意識しない限り、アドバイスを生かせるようにはならないし、
同じ説明を繰り返しても、生かされないなら無駄な説明として回答しなく
なるでしょうね。

まずは小学校の算数の教科書で時間の計算をおさらいした方がいいと思います。
計算内容は全くそのレベルの話ですから。

[ツリー表示へ]
タイトルRe^14: 時間(??分??秒)を合算するには?
記事No12566
投稿日: 2008/06/18(Wed) 13:33
投稿者tea
Renardさん、るしぇさん、回答ありがとうございます。

私がしたかったことはダミーデータ(例として"10:00")の時間を18人分集
計した合計時間を表示したかったんですが、良く考えたら私のコードでは
10分00秒ではなく10時間00分となっていたんですね。
今更ですが間違いに気が付きました。
それとDateAddやDateDiffはこれから調べてコードも見直していきます。

[ツリー表示へ]
タイトルRe^15: 時間(??分??秒)を合算するには?
記事No12567
投稿日: 2008/06/18(Wed) 13:51
投稿者花ちゃん
> それとDateAddやDateDiffはこれから調べてコードも見直していきます。

だから、最初にここの 日付・時刻関係 はご覧になったのですか? と言ったでしょう

そこに 時間を通常数値のように加減算する  というサンプルがありませんでしたか
見ておられたら、少しくらいは参考になったと思うのですが。
(まったく参考にならなかったという事ですかね(:_;))

[ツリー表示へ]
タイトルRe^16: 時間(??分??秒)を合算するには?
記事No12573
投稿日: 2008/06/18(Wed) 16:42
投稿者tea
> だから、最初にここの 日付・時刻関係 はご覧になったのですか? と言ったでしょう

花ちゃんさん、回答をいただきまして本当にありがとうございます。
再度 日付・時刻関係 を見させていただきました。
以下のようにコードを書き直しました。
駄目駄目な私ですが今後もよろしくお願いします。

Private Function GameTimes(ixTeam As Long)
Dim i  As Integer
Dim dtmData As Date

    For i = 1 To bbPlayerMax
        With mp.Game.Team(ixTeam).Player(i)
            
            If .PlayTime = "" Then
                Exit Function
            End If
            
            dtmData = dtmData + CDate(.PlayTime)
            
            GameTimes = Format$(Int(CSng(dtmData)) * 24 + Hour(dtmData), "0\:") & _
                            Format$(dtmData, "nn:") & Format$(dtmData, "ss")
        End With
    Next
End Function

[ツリー表示へ]
タイトルRe^15: 時間(??分??秒)を合算するには?
記事No12576
投稿日: 2008/06/18(Wed) 21:56
投稿者Renard
> 私がしたかったことはダミーデータ(例として"10:00")の時間を18人分集
> 計した合計時間を表示したかったんですが、

そもそも、.PlayTime(プレー時間?)を文字列で管理しようとしているから、
自分の首を絞めていますよね・・・

私なら、"10:00"ではなく、単純に600(秒)として保持します。
そうすれば、加算も減算も難しいことは何も無いですよね。

あとは、表示するときに「△時間○分×秒」というふうに、変換してやればいいのでは?

#どうすれば、楽にコーディング出来るかをまず考えてみては?
#それと、関数の戻り値の型はどーでもいいっすか?w

[ツリー表示へ]
タイトルRe^16: 時間(??分??秒)を合算するには?
記事No12577
投稿日: 2008/06/18(Wed) 22:26
投稿者tea
Renardさん、回答をしていただきまして本当にありがとうございます。

> そもそも、.PlayTime(プレー時間?)を文字列で管理しようとしているから、
> 自分の首を絞めていますよね・・・
>
> 私なら、"10:00"ではなく、単純に600(秒)として保持します。
> そうすれば、加算も減算も難しいことは何も無いですよね。
>
> あとは、表示するときに「△時間○分×秒」というふうに、変換してやればいいのでは?

確かにその通りですね。

> #どうすれば、楽にコーディング出来るかをまず考えてみては?
> #それと、関数の戻り値の型はどーでもいいっすか?w

いいえ、とりあえず途中まで出来たコードを投稿しただけで、関数の
戻り値は参考書を読み返したり、調べている最中です。
駄目駄目なんで時間がかかるんです。

[ツリー表示へ]
タイトルRe^17: 時間(??分??秒)を合算するには?
記事No12578
投稿日: 2008/06/18(Wed) 22:42
投稿者tea
> #それと、関数の戻り値の型はどーでもいいっすか?w

以下のようにしました。
ただ、これよりRenardさんが教えてくれたご意見方が良い事もわかります。
これから再度考え直します。

Private Function GameTimes(ixTeam As Long) As Date
Dim i  As Integer
Dim dtmData As Date

    For i = 1 To bbPlayerMax
        With mp.Game.Team(ixTeam).Player(i)
            
           If .PlayTime = "" Then
               Exit Function
           End If
            
           dtmData = dtmData + CDate(.PlayTime)
            
           GameTimes = Format$(Int(CSng(dtmData)) * 24 + Hour(dtmData), "00\:") & _
                            Format$(dtmData, "nn:") & Format$(dtmData, "ss")
        End With
    Next
End Function

[ツリー表示へ]