VBAで月初日・月末日を自動入力する方法|DateSerial関数の使い方と翌月・先月への応用

VBAで月初日と月末日を自動入力するには、DateSerial関数を使います。「○月1日」は DateSerial(年, 月, 1)、「○月末日」は DateSerial(年, 月+1, 0) で取得できます。2月やうるう年でも正しく動くため、毎月の帳票作業の最初のひと手間をそのまま自動化できます。

この記事では、次の内容を順番に解説します。

  • 月初日・月末日を取得する基本コード
  • 翌月・先月など任意の月に対応する応用パターン
  • 日付の表示形式を統一する方法
  • 複数セルに一括入力する方法
  • よくある質問(うるう年・翌月の月末・日付がシリアル値で表示される等)

月初日・月末日を取得する基本コードを理解するには?

次のコードは、今日の日付を基準に月初日をA1セル、月末日をB1セルに入力します。

Sub SetFirstAndLastDate()

    Dim base As Date

    base = Date  ' 今日の日付を基準にする

    ' 月初日をA1に入力
    Range("A1").Value = DateSerial(Year(base), Month(base), 1)

    ' 月末日をB1に入力
    Range("B1").Value = DateSerial(Year(base), Month(base) + 1, 0)

    ' 表示形式を統一する
    Range("A1:B1").NumberFormatLocal = "yyyy/m/d"

    MsgBox "月初日・月末日を入力しました。"

End Sub

DateSerialのポイントは「0日」の使い方です。

コード意味例(7月の場合)
DateSerial(年, 月, 1)その月の1日2026/7/1
DateSerial(年, 月+1, 0)翌月の0日=今月の末日2026/7/31

「翌月の0日」という考え方がポイントで、これにより2月(28日または29日)も自動で正しい末日が取れます。

翌月・先月など任意の月に対応するには?

「今月ではなく翌月分の帳票を先に作っておきたい」「先月のデータを確認したい」といった場合は、基準日を調整するだけで対応できます。

Sub SetNextMonthDates()

    Dim base As Date

    ' 翌月を基準にする
    base = DateSerial(Year(Date), Month(Date) + 1, 1)

    Range("A1").Value = DateSerial(Year(base), Month(base), 1)
    Range("B1").Value = DateSerial(Year(base), Month(base) + 1, 0)
    Range("A1:B1").NumberFormatLocal = "yyyy/m/d"

    MsgBox "翌月の月初日・月末日を入力しました。"

End Sub

先月にしたい場合は Month(Date) + 1 を Month(Date) - 1 に変えるだけです。月をまたいだ処理(12月→1月、1月→12月)も DateSerial が自動で年をまたいで計算してくれるため、特別な処理は不要です。

特定の月を固定で指定したい場合は、次のように書きます。

' 2026年10月を対象にする
base = DateValue("2026/10/1")

日付の表示形式を統一するには?

日付をセルに入力した後、表示形式を指定しないと「2026/7/1」ではなく「45839」のようなシリアル値で表示されることがあります。NumberFormatLocalで表示形式を統一しましょう。

表示したい形式書き方表示例
年/月/日"yyyy/m/d"2026/7/1
年月日(漢字)"yyyy年m月d日"2026年7月1日
月/日のみ"m/d"7/1
和暦"ggge年m月d日"令和8年7月1日

複数セルに一括入力するには?

請求書や勤怠表で「複数の箇所に月初・月末を入れたい」場合は、セルの指定をまとめて書けます。

Sub SetDatesMultipleCells()

    Dim base As Date
    Dim firstDay As Date
    Dim lastDay As Date

    base = Date
    firstDay = DateSerial(Year(base), Month(base), 1)
    lastDay = DateSerial(Year(base), Month(base) + 1, 0)

    ' 複数の箇所に同じ日付を入力
    Range("A1").Value = firstDay
    Range("D1").Value = firstDay
    Range("B1").Value = lastDay
    Range("E1").Value = lastDay

    Range("A1,B1,D1,E1").NumberFormatLocal = "yyyy/m/d"

    MsgBox "入力が完了しました。"

End Sub

変数に日付を入れておくことで、同じ計算を何度も書かずに済み、コードの読みやすさも保てます。

まとめ

  • 月初日は DateSerial(Year(base), Month(base), 1)
  • 月末日は DateSerial(Year(base), Month(base) + 1, 0)(翌月の0日=今月末日)
  • 翌月・先月への対応は Month(base) + 1 や -1 で調整するだけ
  • 入力後は NumberFormatLocal で表示形式を統一する
  • 日付を変数に入れておくと、複数セルへの入力でも計算が一か所にまとまる

よくある質問

日付がシリアル値(数字)で表示される場合は?

セルの表示形式が「標準」や「数値」になっているためです。コードに Range("A1").NumberFormatLocal = "yyyy/m/d" を追加するか、セルを選択して「セルの書式設定」→「日付」に変更してください。VBAで値を入れた直後に書式を設定するのが最も確実です。

2月やうるう年でも正しい末日が取れる?

取れます。DateSerial(年, 3, 0) は「3月の0日=2月の末日」を意味するため、その年がうるう年かどうかを自動で判定して28日または29日を返します。うるう年の判定コードを自分で書く必要はありません。

翌月が1月になる場合(12月の翌月)も正しく動く?

動きます。DateSerial(2026, 13, 0) のように月が13になっても、DateSerial が自動で「2027年1月0日=2026年12月31日」と計算してくれます。年をまたぐ処理も特別なコードは不要です。

入力するセルをダイアログで選ばせたい場合は?

Application.InputBox でセル選択ダイアログを出すことができます。

Dim targetCell As Range
Set targetCell = Application.InputBox("月初日を入力するセルを選択してください", Type:=8)
If Not targetCell Is Nothing Then
    targetCell.Value = DateSerial(Year(Date), Month(Date), 1)
    targetCell.NumberFormatLocal = "yyyy/m/d"
End If

月初・月末だけでなく、その月の全日付を一覧で入力したい場合は?

月初日から月末日までをループで入力する方法が使えます。

Dim d As Date
Dim i As Long
Dim firstDay As Date
Dim lastDay As Date

firstDay = DateSerial(Year(Date), Month(Date), 1)
lastDay = DateSerial(Year(Date), Month(Date) + 1, 0)
i = 1

For d = firstDay To lastDay
    Cells(i, 1).Value = d
    Cells(i, 1).NumberFormatLocal = "yyyy/m/d"
    i = i + 1
Next d

これで、A列に1日から末日までの日付が縦に並びます。

動画で学びたい方へ

「記事を読んでも、実際に自分で書けるか不安…」という方には、動画で基礎からじっくり学べる講座がおすすめです。

VBAが初めての方を前提に、つまずきやすいポイントを先回りして解説しています。サンプル動画は無料でご覧いただけます。

動画で学ぶExcelマクロ|JIMOVEオンラインスクール

コメントする

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

上部へスクロール