- ベストアンサー
時間差を取得結果を求めるには
現在VB6.0を使用してエクセルに書かれた日時データから時間間隔を取得出来るようなプログラムを作りたいのですがどうしたらいいのかわかりません。 例えば A行に2007/04/18 10:11:50と書かれていて B行に2007/04/19 12:13:25と書かれていた場合 このAとBの差が何年何ヶ月何日何時間何秒差があるかを求めたいです 何かいい方法があれば教えて下さい。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
No.1、3です。 DateDiff("yyyy", A, B) & "年" & DateDiff("yyyy", A, B) & "ヶ月" & _ DateDiff("yyyy", A, B) & "日" & DateDiff("yyyy", A, B) & "時間" & _ DateDiff("yyyy", A, B) & "分" & DateDiff("yyyy", A, B) & "秒" とりあえず、試しに上記で動作させてみたら時間間隔が短い場合に「0年0ヶ月0日」などの不自然な表示になります。そこで、0の部分は表示されないプログラムを作ってみました。 Public Function 時間間隔(ByVal 時間A As String, ByVal 時間B As String) As String Dim 間隔_秒 As Double Dim 間隔_分 As Double Dim 間隔_時 As Double Dim 間隔_日 As Double Dim 間隔_月 As Double Dim 間隔_年 As Double 間隔_秒 = DateDiff("s", 時間A, 時間B) If 間隔_秒 <= 60 Then 時間間隔 = 間隔_秒 & "秒" Exit Function Else 間隔_秒 = ((間隔_秒 / 60) - Int(間隔_秒 / 60)) * 60 時間間隔 = 間隔_秒 & "秒" End If 間隔_分 = DateDiff("n", 時間A, 時間B) If 間隔_分 <= 60 Then 時間間隔 = 間隔_分 & "分" & 時間間隔 Exit Function Else 間隔_分 = ((間隔_分 / 60) - Int(間隔_分 / 60)) * 60 時間間隔 = 間隔_分 & "分" & 時間間隔 End If 間隔_時 = DateDiff("h", 時間A, 時間B) If 間隔_時 <= 24 Then 時間間隔 = 間隔_時 & "時間" & 時間間隔 Exit Function Else 間隔_時 = ((間隔_時 / 24) - Int(間隔_時 / 24)) * 24 時間間隔 = 間隔_時 & "時間" & 時間間隔 End If 間隔_年 = DateDiff("yyyy", 時間A, 時間B) If 間隔_年 > 1 Then 間隔_月 = DateDiff("m", DateAdd("yyyy", 間隔_年, 時間A), 時間B) 間隔_日 = DateDiff("d", DateAdd("m", 間隔_月, 時間A), 時間B) 時間間隔 = 間隔_年 & "年" & 間隔_月 & "ヶ月" & 間隔_日 & "日" & 時間間隔 Exit Function Else 間隔_月 = DateDiff("m", 時間A, 時間B) If 間隔_月 > 1 Then 間隔_日 = DateDiff("d", DateAdd("m", 間隔_月, 時間A), 時間B) 時間間隔 = 間隔_月 & "ヶ月" & 間隔_日 & "日" & 時間間隔 Exit Function Else 間隔_日 = DateDiff("d", 時間A, 時間B) 時間間隔 = 間隔_日 & "日" & 時間間隔 End If End If End Function 上記のプログラムの利用法は下記の通りです。 RET = 時間間隔(時間A, 時間B) この場合はRETという変数に時間間隔が「何年何ヶ月何日何時間何秒」という形式で、しかも「0年」の場合は「何ヶ月何日何時間何秒」、「0年0ヶ月」の場合は「何日何時間何秒」と無駄な部分を出力しません。1ヶ月の日数が固定されていないので複雑になりましたが参考にしてください。
その他の回答 (6)
- dsuekichi
- ベストアンサー率64% (171/265)
ごめんなさい。 #5の投稿に > #1です。 と、書いてしまいました。 > #2です。 の間違いです。 申し訳ありません。
- dsuekichi
- ベストアンサー率64% (171/265)
#1です。 そういえば、ちゃんと確認していませんでしたが・・・ 質問者のSimanohitoさんは、「1ヶ月の差」の定義をどう考えているんでしょう? 30日個固定とかだと、単純な差分計算でできますが・・・ 暦を意識した場合、 例えば、 「2007/4/26」と「2007/5/27」は「1ヶ月と1日」 「2007/5/26」と「2007/6/27」も「1ヶ月と1日」 と言う風に求めたいなら、単純な計算じゃできないと思いますよ。 4月は30日、5月は31日あるので、 「DateDiff("d",#2007/4/26#,#2007/5/27#)」は「31」で、 「DateDiff("d",#2007/5/26#,#2007/6/27#)」は「32」に なってしまいますから・・・ 「1ヶ月は30日固定」だとした場合なら、 前者は「1ヶ月と1日」で、後者は「1ヶ月と2日」になりますね。
- PED02744
- ベストアンサー率40% (157/390)
(1)年月日時分秒を秒に変換する関数を作る (2)秒を年月日時分秒に変換する関数を作る (3)それぞれを(1)で作った関数で秒に直して、引き算する (4)引き算された結果を(2)で作った関数で年月日時分秒に直す ってだけじゃないんですか? 例えば今日なら、2007年04月26日ですから 2006*365+2006/4-2006/100+2006/400-(2006/1600 -1) 日が2006年12月31日までの日数 うるう年は、4年に一回あって、100年に一回なくて、400年に一回あって、1600年に一回ない(んだけど1600年はうるう年だったので1足す) 2007年に入ってからも同様に 31+28+31 +26 (3月いっぱいの日数 +26日) 一日は何秒か・一時間は何秒か・一分は何秒か ・・・それぞれわかってるのですから、簡単でしょ?
>複数回使用してという複数回とはどのようにしようしたらよろしいのでしょうか。 1.DateDiff("yyyy",A,B) 2.DateDiff("m",A,B) 3.DateDiff("d",A,B) 4.DateDiff("h",A,B) 5.DateDiff("n",A,B) 6.DateDiff("s",A,B) 1つ目で日付Aと日付Bの間が何年か、2つ目で何ヶ月か、3つ目以降が何日か、何時間か、何分か、何秒かとなっています。これらの関数で求めた結果をつなげれば良いです。どうやってつなげるのかはご自分で考えたり調べたりして下さい。文字列の連結はVBの基礎の基礎程度なので分からない場合は勉強不足です。VB6.0は分かり易く解説しているサイトが多いのでそういったサイトを利用して勉強して下さい。
- dsuekichi
- ベストアンサー率64% (171/265)
> このAとBの差が何年何ヶ月何日何時間何秒差があるかを求めたいです 「何年何ヶ月」が無ければ結構楽なんですけどね・・・ #日までは、1日=24時間。1時間=60分。1分=60秒と決まってますので、単純な引き算と割り算でできますが、 #1ヶ月=28日~31日。1年=365or366日と変わりますから・・・ DateAdd関数で、秒単位、分単位、時単位、日単位、月単位、年単位の順に1づつ加算していって、同じになるまで、各々何回加算できるかを調べるとか・・・ 例えば、 > A行に2007/04/18 10:11:50と書かれていて > B行に2007/04/19 12:13:25と書かれていた場合 だと、 先ずAに秒を加算していくと、35回加算すると、 Aは「2007/04/18 10:12:25」となって、秒が一致。 次に、分を1回加算すると、 Aは「2007/04/18 10:13:25」となって、分が一致。 次に、時を2回加算すると、 Aは「2007/04/18 12:13:25」となって、時が一致。 次に、日を1回加算すると、 Aは「2007/04/19 12:13:25」となって、日が一致。 次に、月を0回加算すると、 Aは「2007/04/19 12:13:25」となって、月が一致。 次に、年を0回加算すると、 Aは「2007/04/19 12:13:25」となって、年が一致。 で、0年0ヶ月1日 2時間1分35秒 とか・・・
DateDiff(時間間隔の単位,A,B) 上記の関数で時間Aから時間Bまでの経過時間が分かります。ちなみに「時間間隔の単位」というのは "yyyy"=年 "m"=月 "d"=日 "h"=時 "n"=分 "s"=秒 となります。1つの式で何年何ヶ月何日何時間何秒差を求めることは出来ないようなので複数回DateDiff関数を使用して求めてください。
補足
ご連絡が大変遅くなりまして申し訳ございません。 上記回答ありがとうございました。 ただ複数回使用してという複数回とはどのようにしようしたらよろしいのでしょうか。