日付の表示形式
「yyyy/mm/dd」「yyyy年m月d日」「時刻」「曜日つき」から、列全体への一括設定、先頭ゼロ、提出用整形まで。初心者が迷わない最短コードと安全テンプレートでまとめます。基本は Range.NumberFormat(環境非依存)か NumberFormatLocal(日本語ロケール)を使います。
基本:よく使う日付・時刻の表示形式
Sub DateFormatBasics()
'西暦:2025/12/03
Range("C2").NumberFormat = "yyyy/mm/dd"
'西暦:2025-12-03(区切りをハイフン)
Range("C3").NumberFormat = "yyyy-mm-dd"
'年月日:2025年12月3日(日本語)
Range("C4").NumberFormatLocal = "yyyy年m月d日"
'時刻:21:03:00(24時間制)
Range("D2").NumberFormat = "hh:mm:ss"
'日時:2025/12/03 21:03
Range("D3").NumberFormat = "yyyy/mm/dd hh:mm"
End Sub
VB- ポイント: NumberFormat は英語書式。日本語表記にしたいときは NumberFormatLocal を使うと楽。
曜日入り・月名入り・和暦などの表現
Sub DateFormatWithWeekday()
'曜日(短縮):2025/12/03 (水)
Range("E2").NumberFormatLocal = "yyyy/mm/dd (aaa)"
'曜日(完全):2025/12/03 水曜日
Range("E3").NumberFormatLocal = "yyyy/mm/dd aaaa"
'和暦:令和7年12月3日
Range("E4").NumberFormatLocal = "ggge年m月d日"
'英語月名:Dec 03, 2025
Range("E5").NumberFormat = "mmm dd, yyyy"
'英語月名(フル):December 3, 2025
Range("E6").NumberFormat = "mmmm d, yyyy"
End Sub
VB- ポイント: 日本語の曜日は「aaa/aaaa」。和暦は「ggge」を使います。英語月名は「mmm/mmmm」。
列全体・表全体に一括設定(動的最終行)
Sub FormatDateColumns()
Dim last As Long
'C列:日付列の最終行を取得
last = Cells(Rows.Count, "C").End(xlUp).Row
'C列を西暦 yyyy/mm/dd に
Range("C3:C" & last).NumberFormat = "yyyy/mm/dd"
'D列が日時なら yyyy/mm/dd hh:mm に
last = Cells(Rows.Count, "D").End(xlUp).Row
Range("D3:D" & last).NumberFormat = "yyyy/mm/dd hh:mm"
End Sub
VB- ポイント: 最終行は基準列から取得して、意図した範囲だけに適用する。
文字列を日付として扱うときの安全手順
Sub ParseStringToDateAndFormat()
'文字列を日付に変換してから表示形式を設定
Dim r As Range
For Each r In Range("B3:B10")
If IsDate(r.Value) Then
r.Value = CDate(r.Value)
End If
Next
Range("B3:B10").NumberFormat = "yyyy/mm/dd"
End Sub
VB- ポイント: 文字列のままでは書式が効かないことがあるため、CDate などで日付型に変換してから書式指定。
入力前に書式を決めておく(崩れ防止)
Sub PrepareDateColumnBeforeInput()
'先に書式を設定 → 値を書き込み
With Range("C3:C20")
.NumberFormat = "yyyy/mm/dd"
.Value = WorksheetFunction.Transpose(Array(#2025/12/01#, #2025/12/02#, #2025/12/03#, #2025/12/04#, #2025/12/05#, #2025/12/06#, #2025/12/07#, #2025/12/08#, #2025/12/09#, #2025/12/10#, #2025/12/11#, #2025/12/12#, #2025/12/13#, #2025/12/14#, #2025/12/15#, #2025/12/16#, #2025/12/17#, #2025/12/18#, #2025/12/19#, #2025/12/20#))
End With
End Sub
VB- ポイント: 表示形式→値の順にすると安定。日付リテラルは #yyyy/mm/dd# で正しく入る。
ユーザー入力に応じて書式を切り替える
Sub ToggleDateFormat()
Dim rng As Range: Set rng = Range("C3:C100")
Dim useJapanese As Boolean
useJapanese = (MsgBox("日本語表記(yyyy年m月d日)にしますか?", vbYesNo) = vbYes)
If useJapanese Then
rng.NumberFormatLocal = "yyyy年m月d日"
Else
rng.NumberFormat = "yyyy/mm/dd"
End If
End Sub
VB- ポイント: 共有相手の環境に合わせて切替できると運用が楽。
日付+時刻を見やすく整える(提出用)
Sub SubmissionFriendlyDateTime()
Dim last As Long
last = Cells(Rows.Count, "B").End(xlUp).Row
'日時列(B):yyyy/mm/dd hh:mm、中央揃え、幅調整
With Range("B3:B" & last)
.NumberFormat = "yyyy/mm/dd hh:mm"
.HorizontalAlignment = xlCenter
End With
'日付列(C):yyyy年m月d日、週報ヘッダーは強調
With Range("C3:C" & last)
.NumberFormatLocal = "yyyy年m月d日"
End With
With Range("B2:C2")
.Font.Bold = True
.Interior.Color = RGB(221, 235, 247)
.HorizontalAlignment = xlCenter
End With
Columns("B:C").AutoFit
End Sub
VB- ポイント: 表示形式と装飾(中央揃え・太字・背景色)は分けて設定すると読みやすい。
例題で練習
例題1:日付列を「yyyy/mm/dd」、時刻列を「hh:mm」に一括設定
Sub Example_FormatDateTimeColumns()
Dim lastDate As Long, lastTime As Long
lastDate = Cells(Rows.Count, "C").End(xlUp).Row
lastTime = Cells(Rows.Count, "D").End(xlUp).Row
Range("C3:C" & lastDate).NumberFormat = "yyyy/mm/dd"
Range("D3:D" & lastTime).NumberFormat = "hh:mm"
End Sub
VB例題2:曜日つき日本語表記に
Sub Example_JapaneseWeekday()
Dim last As Long
last = Cells(Rows.Count, "E").End(xlUp).Row
Range("E3:E" & last).NumberFormatLocal = "yyyy年m月d日 (aaa)"
End Sub
VB例題3:和暦で提出(令和表記)
Sub Example_JapaneseEra()
Dim last As Long
last = Cells(Rows.Count, "F").End(xlUp).Row
Range("F3:F" & last).NumberFormatLocal = "ggge年m月d日"
End Sub
VB実務の落とし穴と対策
- 文字列扱いで書式が効かない: CDate や DateValue で日付型に変換してから書式を設定する。
- 環境差で見え方がズレる: 共有相手が英語環境なら NumberFormat、国内運用なら NumberFormatLocal が楽。
- 日付と時刻が混在: 「yyyy/mm/dd hh:mm」など統一の日時書式に寄せる。
- 大量範囲で遅い: Application.ScreenUpdating=False を併用し、必要範囲だけに絞って適用。
- 先に値を貼っても崩れる: できれば表示形式→値の順。外部データの文字列日付は変換してから書式。
