達人養成塾 小川です。
今日は、受講生からいただいた質問から。
さいきん、不動産業界にお勤めの受講生の方から、以下のような質問をいただいた。
日割り計算を自動的にできるようにしたい。
現在ですと、8 月16日契約開始なら31日-15日=16日など考えてから入れるのでたまに間違えます。
特にフリーレントがあって、賃料発生日が翌月になったりすると月の日数が31日から30日変わったことを反映できなくてミスが発生します。
また、1日から15日に賃料が発生する場合は、当月分のみ請求、16 日以降に賃料が発生する場合は翌月分賃料を請求するなど自動化できればと思います。
というわけで、こういったケースにどう対応するか。
いきなりすべて解決しようとはせず、まずは、「指定された日からの月末までの賃料を日割り計算で求める」という課題だけ解いてみよう。
日割りの計算というのは、月ごとに「その月は何日あるのか」が異なるので、計算がけっこうややこしい。
こういう計算はどうやるかというと、だいたい以下の要領。
‘月末の日とは、「翌月の最初の日の、一日前」
‘ということで、以下の要領でその日を求める
‘[1]指定された日を含む月の1日がいつか調べる
‘[2]そして、その翌月1日がいつか調べる
‘[3]そして、その1日前がいつか調べる
サンプルコードを、以下に示してみた。
Sub GetLastDayOfTheMonth()
‘月末の日とは、「翌月の最初の日の、一日前」
‘ということで、以下の要領でその日を求める
‘[1]指定された日を含む月の1日がいつか調べる
‘[2]そして、その翌月1日がいつか調べる
‘[3]そして、その1日前がいつか調べる
Dim d As Date
d = Date ‘例えば、今月の末日を調べるなら…。
Dim y As Long
Dim m As Long
y = Year(d)
m = Month(d)
Dim dFitstday As Date
Dim dTmp As Date
dFitstday = CDate(y & “/” & m & “/” & 1) ‘[1]指定された日を含む月の1日がいつか調べる
dTmp = DateAdd(“m”, 1, dFitstday) ‘[2]その翌月1日がいつか調べる
dTmp = DateAdd(“d”, -1, dTmp) ‘[3]その1日前がいつか調べる
‘以下、いろいろ計算してみる。
‘最終的に、100,000円の賃料を日割りで案分してみよう。
‘分かりにくいかもしれないので、随時、計算結果を書き出しつつ解説。
Range(“D2”).Value = dTmp ‘今月末の日付を書き出す
‘今月は何日まであるか、調べてみよう。以下の要領
Dim cDays As Long
cDays = DateDiff(“d”, dFitstday, dTmp) + 1
Range(“E2”).Value = cDays
‘今月末まで、あと何日残っているか調べて書き出してみよう
Range(“F2”).Value = dTmp – d
‘以下は、100,000円を日割りで案分した例
Range(“G2”).Value = 100000 / cDays * (dTmp – d)
End Sub