• 締切済み

エクセル(VBもしくは、VBA)を使用しての時間の計算について

皆さん、初めまして 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 の様な感じのものです。 基本的なことで大変、恐縮ですが、ご教授願えればと思います。 宜しくお願い致します。

みんなの回答

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.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

yu_ki1209
質問者

お礼

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

  • mt2008
  • ベストアンサー率52% (885/1701)
回答No.1

「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 です。秒をシリアル値で扱うために掛けたり割ったりしています。

yu_ki1209
質問者

お礼

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

関連するQ&A