プロが教える店舗&オフィスのセキュリティ対策術

はじめて質問します。
ACCESS2000を使用しています。

DataDiffを使用して[終了年月日]から[開始年月日]の間の、
年数と月数を求めたいのですが。(3年4ヶ月などというように)
1月31日から2月1日とした時に1月とされてしまう点や、負の数が返されてしまう点を改善したいのですが。

宜しくお願いします。

A 回答 (3件)

No.1


下記に訂正。

Option Explicit

Public Function GetDateDiffFormatString(ByVal dtmStart As Date, ByVal dtmEnd As Date) As String
Dim strRet As String
Dim intYear As Integer
Dim intMonth As Integer
Dim intDay As Integer

intYear = DateDiff("yyyy", dtmStart, dtmEnd)
intMonth = DateDiff("m", dtmStart, dtmEnd)

If (Day(dtmStart) > Day(dtmEnd)) And (Not IsEndOfMonth(dtmEnd)) Then
intMonth = intMonth - 1
End If

If intMonth >= 12 Then
intMonth = intMonth Mod 12
End If

If DateSerial(Year(dtmEnd), Month(dtmStart), Day(dtmStart)) _
> DateSerial(Year(dtmEnd), Month(dtmEnd), Day(dtmEnd)) Then
intYear = intYear - 1
End If

If Day(dtmStart) <= Day(dtmEnd) Then
If IsEndOfMonth(dtmStart) Then
intDay = 0
Else
intDay = Day(dtmEnd) - Day(dtmStart)
End If
Else
If IsEndOfMonth(dtmEnd) Then
intDay = DateDiff("d", dtmStart, GetEndOfMonth(dtmStart))
Else
intDay = DateDiff("d", dtmStart, GetEndOfMonth(dtmStart)) _
+ DateDiff("d", GetStartOfMonth(dtmEnd), dtmEnd) + 1
End If
End If

If intYear <> 0 Then
strRet = CStr(intYear) & "年"
End If

If intMonth <> 0 Then
strRet = strRet & CStr(intMonth) & "月"
End If

If intDay <> 0 Then
strRet = strRet & CStr(intDay) & "日"
End If

GetDateDiffFormatString = strRet

End Function

Public Function IsEndOfMonth(ByVal dtmSource As Date) As Boolean
'月末日であるかどうかを判定。
IsEndOfMonth = (dtmSource = GetEndOfMonth(dtmSource))
End Function

Public Function GetEndOfMonth(ByVal dtmSource As Date) As Date
'月末日を求める。
GetEndOfMonth = DateSerial(Year(dtmSource), Month(dtmSource) + 1, 0)
End Function

Public Function GetStartOfMonth(ByVal dtmSource As Date) As Date
'月初を求める。
GetStartOfMonth = DateSerial(Year(dtmSource), Month(dtmSource), 1)
End Function

この回答への補足

何も分からず本当にすいません。

今フォームには[開始日][終了日][期間_年][期間_月]となっています。
終了日が更新された時にイベントを入れれば宜しいのでしょうか?
質問内容を詳しく記載せず、本当に申し訳ありませんでした。

補足日時:2003/10/22 10:52
    • good
    • 0
この回答へのお礼

こんなに早く、詳しい回答が頂けて嬉しいです。
詳しい回答本当にありがとうございます!!
早速試してみます。
助かりました。

初心者なもので何も分からず、本当に申し訳ありませんでした。

お礼日時:2003/10/22 10:48

>年数と月数を求めたいのですが。

(3年4ヶ月などというように)

これについては単純に月でDateDiffを呼んで、12で割って商と余りを求めれば1発でしょう。


>> 1月31日から2月1日とした時に1月とされてしまう点や、
>負の数が返されてしまう点を改善したい

1ヶ月と数えられるのは仕様なんですけどねぇ。
2-1なんですから。
それに文句をつけちゃなんにもできませんよ。

対応するにゃ終了日に1日足せばいいじゃないですか。

負の数だって、数学的に考えて絶対値を取れば何にも問題ないんじゃないですか?
Abs()でできますよね。
    • good
    • 0
この回答へのお礼

すいませんでした。
初心者なもので考えが浮かばず・・・
参考になりました!
本当にありがとうございました。

お礼日時:2003/10/22 10:46

> 1月31日から2月1日とした時に1月とされてしまう点や、負の数が返されてしまう点を改善したい



一例ですが、下記の要領で。
# 日付の前後 ( 大小 ) 関係が逆転する場合の対応は、例外を発生させるか、引数を入れ替えて処理するか、のどちらかでしょうか?
# ( 専門家のフォローを希望 )

Option Explicit

Public Function GetDateDiffFormatString(ByVal dtmStart As Date, ByVal dtmEnd As Date) As String
Dim strRet As String
Dim intYear As Integer
Dim intMonth As Integer
Dim intDay As Integer

intYear = DateDiff("yyyy", dtmStart, dtmEnd)
intMonth = DateDiff("m", dtmStart, dtmEnd)

If (Day(dtmStart) > Day(dtmEnd)) And (Not IsEndOfMonth(dtmEnd)) Then
intMonth = intMonth - 1
End If

If intMonth >= 12 Then
intMonth = intMonth Mod 12
End If

If DateSerial(Year(dtmEnd), Month(dtmStart), Day(dtmStart)) _
> DateSerial(Year(dtmEnd), Month(dtmEnd), Day(dtmEnd)) Then
intYear = intYear - 1
End If

If Day(dtmStart) <= Day(dtmEnd) Then
intDay = Day(dtmEnd) - Day(dtmStart)
Else
If IsEndOfMonth(dtmEnd) Then
intDay = DateDiff("d", dtmStart, GetEndOfMonth(dtmStart))
Else
intDay = DateDiff("d", dtmStart, GetEndOfMonth(dtmStart)) _
+ DateDiff("d", GetStartOfMonth(dtmEnd), dtmEnd) + 1
End If
End If

If intYear <> 0 Then
strRet = CStr(intYear) & "年"
End If

If intMonth <> 0 Then
strRet = strRet & CStr(intMonth) & "月"
End If

If intDay <> 0 Then
strRet = strRet & CStr(intDay) & "日"
End If

GetDateDiffFormatString = strRet

End Function

Public Function IsEndOfMonth(ByVal dtmSource As Date) As Boolean
'月末日であるかどうかを判定。
IsEndOfMonth = (dtmSource = GetEndOfMonth(dtmSource))
End Function

Public Function GetEndOfMonth(ByVal dtmSource As Date) As Date
'月末日を求める。
GetEndOfMonth = DateSerial(Year(dtmSource), Month(dtmSource) + 1, 0)
End Function

Public Function GetStartOfMonth(ByVal dtmSource As Date) As Date
'月初を求める。
GetStartOfMonth = DateSerial(Year(dtmSource), Month(dtmSource), 1)
End Function
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!