|
>dt2 = DateSerial(Year(dt2), Month(dt2) + CLng(Day(dt1) <> Day(dt2)), Day(dt2))
もうちょっと分かりやすく書くと↓のようになります。
If Day(dt1) <> Day(dt2) Then
dt2 = DateSerial(Year(dt2), Month(dt2) - 1, Day(dt2))
End If
例えば、1/31のひと月後は
>dt2 = DateSerial(Year(dt1), Month(dt1) + 1, Day(dt1))
で計算すると、勝手に(気を利かせて?) 3/2 となります。
このような場合は、月の部分だけを見ると、ふた月後になっていますから、
月の部分を再度 -1 してやらなければ正しい結果が得られません。
このような現象が起こる場合は、必ず
Day(dt1) <> Day(dt2) … 今の例なら 31 <> 2
が成立しますから(↑の式が True になる)、これをLong型に変換して
CLng(Day(dt1) <> Day(dt2)) = -1
よって、元の日付と変換後の日付の日にちの部分が異なる場合は、月の部分を -1 する
という意味になります。
ちなみに、12/31 の ひと月後は、正しく 1/31 と算出されますから、-1 するのに年またぎの考慮は不要です。
このような書き方は、ある種のテクニックと考えてよいと思いますが、
↓のようなサンプルで、少しは理解の助けになるでしょうか?
(エラー処理していません)
Sub ex1()
Dim a As Long
Dim b As Long
a = Application.InputBox("整数を入力してください", "変数 a を決定", Type:=1)
b = Application.InputBox("整数を入力してください", "変数 b を決定", Type:=1)
MsgBox "a = b ?" & vbCrLf & (a = b) & " --> " & CLng(a = b)
End Sub
|
|