- 締切済み
エクセル(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 の様な感じのものです。 基本的なことで大変、恐縮ですが、ご教授願えればと思います。 宜しくお願い致します。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 ご質問は、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
- mt2008
- ベストアンサー率52% (885/1701)
「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 です。秒をシリアル値で扱うために掛けたり割ったりしています。
お礼
返信が大変遅くなり申し訳ありません。 ご教授、ありがとうございます。
お礼
返答が遅くなり大変申し訳ありません。 回答ありがとうございました。 大変、参考になりました。