No.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
この回答への補足
何も分からず本当にすいません。
今フォームには[開始日][終了日][期間_年][期間_月]となっています。
終了日が更新された時にイベントを入れれば宜しいのでしょうか?
質問内容を詳しく記載せず、本当に申し訳ありませんでした。
こんなに早く、詳しい回答が頂けて嬉しいです。
詳しい回答本当にありがとうございます!!
早速試してみます。
助かりました。
初心者なもので何も分からず、本当に申し訳ありませんでした。
No.2
- 回答日時:
>年数と月数を求めたいのですが。
(3年4ヶ月などというように)これについては単純に月でDateDiffを呼んで、12で割って商と余りを求めれば1発でしょう。
>> 1月31日から2月1日とした時に1月とされてしまう点や、
>負の数が返されてしまう点を改善したい
1ヶ月と数えられるのは仕様なんですけどねぇ。
2-1なんですから。
それに文句をつけちゃなんにもできませんよ。
対応するにゃ終了日に1日足せばいいじゃないですか。
負の数だって、数学的に考えて絶対値を取れば何にも問題ないんじゃないですか?
Abs()でできますよね。
No.1
- 回答日時:
> 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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelで2つのセルにある日付を参照させ期間として1つのセルに表示したいです。 例 c9セルに開始 3 2023/04/06 12:16
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/01/10 09:15
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/04/13 10:55
- Excel(エクセル) エクセル「社員の重なっている仕事時間の算出方法について」教えてください。 6 2023/02/06 00:10
- 運転免許・教習所 違反点数についての質問です 15年前にスピード違反で免停。1日の処分者講習を受けました。2017年2 2 2022/06/12 16:12
- Excel(エクセル) 【関数】ハイフン(-)を月や日に変えたい。スペースを削除したい。 4 2023/07/12 08:49
- 就職・退職 有給休暇日数について教えてください…! 4月1日に入社し、次の年の4月14日付で退職したのですが有給 6 2023/08/26 04:36
- 労働相談 有給の計算について 3 2023/05/20 13:11
- 簿記検定・漢字検定・秘書検定 簿記3級の勘定記入教えてください 2 2022/06/28 10:56
- 不動産業・賃貸業 賃貸の解約について質問です。 不動産会社の言うことが分からず質問させていただきました。 新築のマンシ 1 2022/08/06 19:35
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
古希を前にした妻に男ができて
-
母の日のプレゼントを辞退され...
-
せっかくの誕生日だったのに・...
-
夫の誕生日を祝う気持ちになれない
-
家族の誕生日を祝うのは義務で...
-
「お年を召された」は何歳から?
-
お嬢様の男性バージョンって何...
-
20歳を「はたち」と言わない理由
-
近々息子の嫁が里帰り出産しま...
-
人生で最悪の誕生日
-
成人した息子が、手に負えない...
-
嫌いな人から誕生日おめでとうL...
-
誕生日、彼から何もなかった
-
エホバの証人の家族との付き合い方
-
同じ誕生月の兄弟、姉妹がいる...
-
男の人に聞きたい!前妻を思い...
-
子供や孫の誕生日祝い、何歳ま...
-
大人の女性「誕生日嬉しくない...
-
お誕生日祝いをしたいと言った...
-
19歳の誕生日って 19thですか? ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
近々息子の嫁が里帰り出産しま...
-
高校の入学式に父親は出席しま...
-
「お年を召された」は何歳から?
-
お嬢様の男性バージョンって何...
-
19歳の誕生日って 19thですか? ...
-
古希を前にした妻に男ができて
-
「年配」とは何歳以上?
-
お宮参りに参加するつもりの義...
-
20歳を「はたち」と言わない理由
-
誕生日が変えられたのは、いつ...
-
人生で最悪の誕生日
-
孫が 稚児行列に参加するので...
-
嫌いな人から誕生日おめでとうL...
-
せっかくの誕生日だったのに・...
-
男の人に聞きたい!前妻を思い...
-
同じ誕生月の兄弟、姉妹がいる...
-
成人した息子が、手に負えない...
-
誕生日、彼から何もなかった
-
夫の誕生日を祝う気持ちになれない
-
親の命日と自分の誕生日が同じ...
おすすめ情報