重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

皆さん、初めまして
yu_kiと申します。
初めて投稿します。
hh:mm:ss:ffの計算とhh:mm:ss:ffの差分の計算式を作成したいのですが
初心者なので、どのように記載すればよいのかわからず、また
色々なサイトを見ているのですが、どれも的を得ていない為、今回
質問させて頂きました。
作成したいのは、下記の様な感じの表です。
例)  (Aの答え)   (Bの答え)       (Cの答え)
 03:00:10:00  01:00:30:00  差分 xx:xx:xx:xx
の様な感じのものです。
基本的なことで大変、恐縮ですが、ご教授願えればと思います。
宜しくお願い致します。

A 回答 (2件)

こんにちは。



ご質問は、VBAかVBでしたので、ユーザー定義関数を作りました。
ff は、0~29側を使いました。

以下を作った後、#1さんの数式がきれいにまとまっているので、数式をVBA側に移植しようと、あれこれ試してみましたが、別途計算をしないと誤差が出て出来ませんでした。

以下は、マイナス値にも対応していますが、エラー処理はほとんどされていません。


'-------------------------------------------
'標準モジュール
'-------------------------------------------

Function FrmTimeDif(arg1 As Variant, arg2 As Variant) As String
  Dim ar1 As Variant
  Dim ar2 As Variant
  Dim ret1 As Date
  Dim ret2 As Date
  Dim dif1 As Double
  Dim dif2 As String
  Dim res1 As Double
  Dim res2 As Double
  Dim buf3 As Double
  Dim vDif1 As Variant
  Dim mSgn As String
  'セルの一般計算用
  If TypeName(arg1) = "Range" Then
    If IsDate(arg1.Text) And IsDate(arg2.Text) Then
      If arg1 < arg2 Then
        FrmTimeDif = "-" & Format$(arg2 - arg1, "hh:mm:ss")
      Else
        FrmTimeDif = Format$(arg1 - arg2, "hh:mm:ss")
      End If
      Exit Function
    End If
  End If
  ar1 = Split(arg1, ":")
  ar2 = Split(arg2, ":")
  
  ret1 = TimeSerial(ar1(0), ar1(1), ar1(2))
  ret2 = TimeSerial(ar2(0), ar2(1), ar2(2))
  If ret1 >= ret2 Then
    res1 = TimeSerial(0, 0, ar1(3) * 2)
    res2 = TimeSerial(0, 0, ar2(3) * 2)
  Else
    ret2 = TimeSerial(ar1(0), ar1(1), ar1(2))
    ret1 = TimeSerial(ar2(0), ar2(1), ar2(2))
    
    res2 = TimeSerial(0, 0, ar1(3) * 2)
    res1 = TimeSerial(0, 0, ar2(3) * 2)
    mSgn = "-"
  End If
  
  
  dif1 = (res1 - res2)
  If dif1 < 0 Then
    buf3 = TimeSerial(0, 0, 1)
    dif2 = Format(Int((60 - Second(dif1)) / 2), "00")
  Else
    dif2 = Format(Int(Second(dif1) / 2), "00")
  End If
  vDif1 = Format(ret1 - ret2 - buf3, "hh:mm:ss") & ":" & dif2
  FrmTimeDif = mSgn & vDif1
End Function
    • good
    • 0
この回答へのお礼

返答が遅くなり大変申し訳ありません。
回答ありがとうございました。
大変、参考になりました。

お礼日時:2010/01/11 00:06

「ff」ってビデオ等で使われている「フレーム(30フレーム=1秒)」でしょうか?


Excelでは日時を扱うシリアル値としてはフレームは扱えないと思われますので、差分を出したい「Aの答え」「Bの答え」の「03:00:10:00」などは文字列なのですよね?

そうだと仮定して回答します。
「Aの答え」「Bの答え」を時刻を表すシリアル値に変換して差分を演算し、演算結果をフレームを考慮した文字列に変換する事になります。

A1に03:00:10:00、B1に01:00:30:00 と、文字列が入って居るとします。

A2に =TIMEVALUE(LEFT(A1,LEN(A1)-3))+RIGHT(A1,2)/30/86400
B2に =TIMEVALUE(LEFT(B1,LEN(B1)-3))+RIGHT(B1,2)/30/86400

これで、シリアル値になりますので、C2に =A2-B2 と入れ、シリアル値で差分を出します。
最後にC1に 
=TEXT(FLOOR(C2,1/86400),"hh:mm:ss:")&TEXT(MOD(C2*86400,1)*30,"00")
と、入れてシリアル値を文字列に変換します。

#86400 = 24*60*60 です。秒をシリアル値で扱うために掛けたり割ったりしています。
    • good
    • 0
この回答へのお礼

返信が大変遅くなり申し訳ありません。
ご教授、ありがとうございます。

お礼日時:2010/01/11 00:10

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