ExcelVBAにおいて(VBAを使わなくていけないということではありません)

二つのセルに分かれて、時刻(年月日、時分秒)が記録されています。
(例
セルA1(2014/4/21)とセルA2(23:12:56)
例終わり)
このような二つのセルが一組である時点の時間を表しており、そのようなセル二つから経過時間を求めるためのコードを募集します。
なお、日付の方の書式設定は「日付:種類は*2014/3/14」
時間の方は「ユーザー定義-種類は-h:mm」
です。
例えば、日付が「2014/5/1」時刻が「12:00:00」から
「2014/5/3」時刻が「13:02:00」
ならば2日と1時間2分といった具合です。
答えはまた、分割して、日付の部分と時間の部分に出力したいです。
よろしくお願いします。

具体的なコードへの説明のある方へ高ポイントを配布します。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2014/05/04 13:15:01
  • 終了:2014/05/04 17:51:06

ベストアンサー

id:snow0214 No.1

snow0214回答回数470ベストアンサー獲得回数1162014/05/04 14:25:36

ポイント300pt

こんな感じでどうでしょう。
A1=年月日,A2=時分秒
B1=年月日,B2=時分秒

A1,A2とB1,B2の差をC1に代入します。

Sub hoge()
    Dim ti0, ti1 As Date
    Dim td As Long
    Dim dd, hh, mm, ss As Integer
    Dim res As String

    ti0 = ActiveSheet.Cells(1, 1).Value + ActiveSheet.Cells(2, 1).Value
    ti1 = ActiveSheet.Cells(1, 2).Value + ActiveSheet.Cells(2, 2).Value
    '差を計算する
    If (ti0 < ti1) Then
        td = DateDiff("s", ti0, ti1)          '日時の差
        dd = Int(td / 60 / 60 / 24)
       hh = Int((td - dd * 60 * 60 * 24) / (60 * 60))
        mm = Int((td - dd * 60 * 60 * 24 - hh * 60 * 60) / 60)
        ss = Int(td - dd * 60 * 60 * 24 - hh * 60 * 60 - mm * 60)
        res = ""
        If (dd <> 0) Then res = dd & "日"
        res = res & hh & "時間" & mm & "分" & ss & "秒"
    Else
        res = "日時の順序を入れ替えてください"
    End If
    '表示
    ActiveSheet.Cells(1, 3).Value = res
End Sub

関数で書くと次のようになります。

=TEXT((B1+B2)-(A1+A2),"d日h時間m分s秒")

その他の回答(1件)

id:snow0214 No.1

snow0214回答回数470ベストアンサー獲得回数1162014/05/04 14:25:36ここでベストアンサー

ポイント300pt

こんな感じでどうでしょう。
A1=年月日,A2=時分秒
B1=年月日,B2=時分秒

A1,A2とB1,B2の差をC1に代入します。

Sub hoge()
    Dim ti0, ti1 As Date
    Dim td As Long
    Dim dd, hh, mm, ss As Integer
    Dim res As String

    ti0 = ActiveSheet.Cells(1, 1).Value + ActiveSheet.Cells(2, 1).Value
    ti1 = ActiveSheet.Cells(1, 2).Value + ActiveSheet.Cells(2, 2).Value
    '差を計算する
    If (ti0 < ti1) Then
        td = DateDiff("s", ti0, ti1)          '日時の差
        dd = Int(td / 60 / 60 / 24)
       hh = Int((td - dd * 60 * 60 * 24) / (60 * 60))
        mm = Int((td - dd * 60 * 60 * 24 - hh * 60 * 60) / 60)
        ss = Int(td - dd * 60 * 60 * 24 - hh * 60 * 60 - mm * 60)
        res = ""
        If (dd <> 0) Then res = dd & "日"
        res = res & hh & "時間" & mm & "分" & ss & "秒"
    Else
        res = "日時の順序を入れ替えてください"
    End If
    '表示
    ActiveSheet.Cells(1, 3).Value = res
End Sub

関数で書くと次のようになります。

=TEXT((B1+B2)-(A1+A2),"d日h時間m分s秒")
id:a-kuma3 No.2

a-kuma3回答回数4363ベストアンサー獲得回数18002014/05/04 16:25:24

ポイント200pt

日付や時刻のセルは、実は 1900/1/1 0:00 からの相対日です。

f:id:a-kuma3:20140504162248p:image
B1 に 2014/5/1 、C1 に 12:00 を入力しました。
F1 は =B1、G1 は =C1 で、書式を yyyy/m/d h:mm にしました。
また、F2 は =B1、G2 は =C1 で、こちらは書式を標準にしたものです。

日付だけを入力すると、時刻が 0:00 の相対日。
時刻だけを入力すると、日付が 1900/1/1 の入力した時刻になります。

つまり、B1+C1 は 2014/5/1 12:00 の相対日になります。

B5 と C5 に差分を求める対象の日と時刻を入力しました。
D2 と E2 は、以下の式です。

=$B5+$C5-($B$1+$C$1)

絶対参照は、セルをコピーしたときに変えたくないのでつけているだけです。
B5+C5 が、2014/5/3 13:02 の 1900/1/1 0:00 からの相対日。
B1+C1 が、2014/5/1 12:00 の 1900/1/1 0:00 からの相対日です。
これを引くことで、2014/5/1 12:00 から 2014/5/3 13:02 の相対日になります。

これを D5 は書式を「d "日"」、E5 は書式を「h "時間" mm "分"」としました。

コメントはまだありません

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません