日付と時刻

VBA 月末日を求める

 月の始まりは毎月1日ですのでなにも問題ありませんが、月末となると月によって異なりますし、2月となれば28日もあれば閏年の29日もあり、VBAで月末日を求めるとなるとそれなりの知識を必要とします。

 ここでは「DateSerial関数」と「DateAdd関数」を使った月末日の求め方を解説します。

DateSerial関数を使って月末日を求める

「DateSerial関数」とは、「年、月、日」をそれぞれ整数で指定することにより日付を特定できる関数です。

たとえば

Sub DTshitei()

  Dim DT As Date

  DT = DateSerial(2021, 8, 20)

  MsgBox DT

End Sub

 次のように 2022年1月の予定表があります。これに月初日と月末日を求め、「月初日」の年月日、および「月末日」の年月日をセルH4,H5に表示します。同時に予定表に日付欄に初日と月末を表示します。

Sub 月初と月末()

 Dim SDT As Date ’月初日

 Dim EDT As Date ’月末日

 SDT = DateSerial(Range(“B2”), Range(“D2”), 1) ‘①

 EDT = DateSerial(Range(“B2”), Range(“D2”) + 1, 0) ‘②

 Range(“H4”) = SDT

 Range(“H5”) = EDT

 Range(“D5”) = Day(SDT)

 Range(“D13”) = Day(EDT)    

End Sub

① 月初日ですから日は当然 1 が入ります。

② 月末日はまず翌月を「Range(“D2”)+1」とし、日を 0 とすれば翌月初日の1日前、つまり当月の月末を得ることができます。

  DateSerial を使って「今日」「今月初日」「今月末日」「翌月月初」「翌月末日」「6か月前の月初」「6か月前の月末」「3か月先の月初」「3か月先の月末」をそれぞれ求めてみます。

・「今日」

 DateSerial(Year(Date), Month(Date), Day(Date))

・「今月初日」

 DateSerial(Year(Date), Month(Date),1)

・「今月月末

 DateSerial(Year(Date), Month(Date) +1, 0)

・「翌月月初」

 DateSerial(Year(Date), Month(Date)+1, 1)

・「翌月月末

 DateSerial(Year(Date), Month(Date) + 2, 0)

・「6か月前の月初」

 DateSerial(Year(Date), Month(Date) – 6, 1)

・「6か月前の月末

 DateSerial(Year(Date), Month(Date) – 5, 0)

・「3か月先の月初」

 DateSerial(Year(Date), Month(Date) + 3, 1)

・「3か月先の月末

 DateSerial(Year(Date), Month(Date) + 4, 0)

 すなわち、DateSerial で月末日を求めるには「求める月の1か月先の0日」を指定することです。

1か月先の「0日」とは、1か月先の初日(1日)の1日前になるので、求める月の月末になるわけです。

「2020年2月末日」は

DateSerial(2020,3,0) となり、「2020/02/29」となります。

注意:この DateSerial で返される値は「年/月/日(月末)」です。「月末の日にち」のみ求める場合は
Day(DateSerial(2020,3,0)) となります。

DateAdd関数を使って月末日を求める

 DateAdd関数を使って月末日を求めるには、若干わかりにくい部分もありますが、一つ一つ分けて考えれば求められます。

Sub 月初月末()

  Dim TDY As Date ‘今日

  Dim TGfirst  As Date ‘当月初日

  Dim YGfirst As Date ‘翌月初日

  Dim TGend As Date ‘今月月末

  Dim TGendD As Long ‘当月月末日

‘「今日」

  TDY = Date

‘「今月初日」

  TGfirst = Format(TDY, “yyyy/mm/01”)

‘「翌月初日

  YGfirst = DateAdd(“m”, 1, TGfirst)

‘「今月末日

  TGend = DateAdd(“d”, -1, YGfirst)

‘「当月月末日」

  TGendD = Format(TGend, “d”)

  Range(“C2”) = TDY

  Range(“C3”) = TGfirst

  Range(“C4”) = YGfirst

  Range(“C5”) = TGend

  Range(“C6”) = TGendD

End Sub

VBA 日付から曜日を求める  和暦を表示するのに Format を使いましたが、日付から曜日を取得するにも、Format関数を使うと便利です。  このほかに...
VBA 日付と時間の間隔を求める  日付と時間の間隔、すなわち経過日数や経過時間等を計算する際に使用する関数に「DateAdd関数」と「DateDiff関数」があります...