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



