
皆さん、初めまして
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件)
- 最新から表示
- 回答順に表示
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
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 です。秒をシリアル値で扱うために掛けたり割ったりしています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
microsoft office for mac につ...
-
Microsoft Officeを2台目のPCに...
-
office2019 のoutlookは2025年1...
-
エクセルの式がわかる方がおら...
-
大学のレポート A4で1枚レポー...
-
Microsoft Formsの「個人情報や...
-
outlookのメールが固まってしま...
-
Excelで〇のついたものを抽出し...
-
Excel 日付を比較したら、同じ...
-
Office2021を別のPCにインスト...
-
Microsoft 365 の支払いが反映...
-
ステータスバーの合計に表示さ...
-
VBAの印刷について
-
エクセル:一定間隔で平均値を...
-
会社のOutlookにてメールを予約...
-
Office 2021 Professional Plus...
-
Windows 11で、IME言語バー(IM...
-
web上にあるエクセルをショート...
-
Office2024インストール後の疑問点
-
マイクロソフト オフィスのサポ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA ListViewの選択Itemを削除する
-
エクセルで検索結果をユーザー...
-
Pythonの3Dグラフ表示に関する...
-
この問題の解き方を教えてください
-
平均滞留時間
-
【VBA】該当する文字列がある列...
-
★花の名前を教えて頂けないでし...
-
EXILIM Z30について
-
YouTubeでvrを見る時画面を2分...
-
「★」を境に文字を分割し隣のセ...
-
横浜市内の格安の理容室を教え...
-
英辞朗はすごいサイバー辞書ですが
-
エクセルVBAで配列?
-
合っていますか? Por favor
-
熱力学についてです。 1.00MPa,...
-
911Tはハンズフリーで話せますか?
-
エクセルVBA 繰り返し
-
時計に関する質問です
-
アリコの保険に入ってる人へ
-
エクセルマクロ(VBA)でテ...
おすすめ情報