はじめに|この記事で得られる価値
VBAで日付と文字列の変換、手が止まってしまった経験はありませんか?
「ファイル名にyyyymmdd形式の日付を入れたいのに、やり方が分からない…」
「文字列を日付にしようとCDateを使ったら、『型が一致しません』エラーでハマった…」
私たち現場の開発者が必ず一度は遭遇する悩みです。
この記事では、「なぜ?」に応えつつ、実務で使えるサンプルと“腹落ち”解説で一気に解決します。
Format/CDateの使い分けや、エラーの原因・対策まで、
やりたいことから探せる逆引き形式+「なぜ動くのか」の理屈も丁寧にカバー。
この記事で、日付と文字列変換の疑問を一緒にスッキリ解決しましょう。
(VBAの基礎や現場活用については『SES現場でVBAできますか?未経験向けExcelマクロ実践術』もご参照ください)
1. シリアル値とは?VBA日付処理の大原則
「Excelで日付をどう管理しているか」、意外と知られていません。
実はシリアル値という「日付を数字で持つ仕組み」がカギです。
- 1900/1/1 → 1
- 2024/1/14 → 45305
- 2024/1/14 12:00 → 45305.5
つまり、日付の正体はただの数値。
セルの「yyyy/mm/dd」表示は“見た目”を変えているだけで、Date型変数にはシリアル値が入っています。
この原則を押さえることで、変換の仕組みやエラー原因も一気に見通せるようになります。
用語解説:VBA
Microsoft Excelなどで使えるプログラミング言語。業務自動化やデータ処理に広く利用される。用語解説:シリアル値
ExcelやVBAで日付・時刻を管理するための「連番の数値」。1900/1/1を1として、1日ごとに1ずつ増える。
2. 逆引き:日付⇔文字列 変換コード集
「理屈より、まず動くサンプルが欲しい!」
私たちの現場では、こんな時がよくあります。
ここでは頻出シーン別に“コピペOK”なコード例をまとめました。
(日付や型変換の基礎については『【完全版】型の変換とは?キャストの基本と落とし穴」 | Java・JavaScript・TypeScriptで徹底理解する型の扱い方』をご参照ください)
2-1. ファイル名に「yyyymmdd」形式の日付を入れる
Sub ConvertToYYYYMMDD()
Dim todayDate As Date
Dim formattedDate As String
todayDate = Date '現在の日付を取得
formattedDate = Format(todayDate, "yyyymmdd")
Debug.Print formattedDate '例: "20240114"
End Sub
2-2. 帳票で和暦+曜日を使いたい
Sub ConvertToWareki()
Dim targetDate As Date
Dim formattedDate As String
targetDate = #1/14/2024#
formattedDate = Format(targetDate, "ggge年m月d日 (aaa)")
Debug.Print formattedDate '例: "令和6年1月14日 (日)"
End Sub
2-3. 「yyyy/mm/dd hh:mm:ss」形式でログ出力
Sub ConvertWithTime()
Dim nowDateTime As Date
Dim formattedDateTime As String
nowDateTime = Now
formattedDateTime = Format(nowDateTime, "yyyy/mm/dd hh:mm:ss")
Debug.Print formattedDateTime
End Sub
2-4. 文字列を日付データに変換する
Sub ConvertStringToDate()
Dim dateStr1 As String
Dim dateStr2 As String
Dim convertedDate1 As Date
Dim convertedDate2 As Date
dateStr1 = "令和6年1月14日"
dateStr2 = "2024.01.14"
convertedDate1 = CDate(dateStr1)
convertedDate2 = CDate(dateStr2)
Debug.Print convertedDate1
Debug.Print TypeName(convertedDate1) 'Date
Debug.Print convertedDate2
End Sub
用語解説:CDate関数
文字列や数値を「日付型(Date型)」に変換するVBAの関数。書式が合わないとエラーになることも。用語解説:Date型
日付や時刻を扱うためのVBAのデータ型。シリアル値として内部管理される。用語解説:Date関数
現在の日付(時刻は0:00:00)を取得するVBAの関数。用語解説:Now関数
現在の日付と時刻を取得するVBAの関数。用語解説:Format関数
VBAで日付や数値を好きな書式(例:yyyy/mm/dd)に変換できる関数。ファイル名や帳票出力でよく使う。
ぜひコードをコピペして、まずは動かしてみてください。
3. 主要関数の違いと選び方
「なぜFormatなのか?」「CDate以外にも方法は?」
ここでは日付⇔文字列の変換でよく使う主要関数4種を整理します。
3-1. 日付→文字列:Format vs CStr
-
Format
書式指定で思い通りの形に変換できる。ファイル名など意図した形式ならFormatが必須。 -
CStr
「とりあえず文字列化」ならこれ。ただしOSの地域設定依存で、想定外の書式になる危険あり。
用語解説:CStr関数
どんな値でも「文字列型」に変換するVBAの関数。日付や数値も一旦文字列にしたい時に使う。
3-2. 文字列→日付:CDate vs DateValue
-
CDate
日付・時刻どちらも解釈。多くのケースはこれ一択。 -
DateValue
「日付部分だけ」変換したいなら使う。時刻は無視。
用語解説:DateValue関数
文字列から「日付部分だけ」をDate型に変換するVBAの関数。時刻情報は切り捨てられる。
3-3. 現在日時の取得:Now / Date / Time
- Now:日付+時刻(例:2024/01/14 15:30:00)
- Date:日付のみ(時刻は0:00:00)
- Time:時刻のみ(1899/12/30)
用語解説:Time関数
現在の時刻のみ(1899/12/30基準)を取得するVBAの関数。
4. 「型が一致しません」エラーの原因と対策
CDateで変換したら型が一致しません、なぜ…?
よくある“ハマりポイント”を3つに整理します。
4-1. 全角文字・余計なスペース
- NG例:
2024/01/14 - 対策: Trim+StrConvでスペース削除&半角変換
Dim dirtyStr As String
dirtyStr = " 2024.1.14 "
Dim cleanStr As String
cleanStr = Trim(StrConv(dirtyStr, vbNarrow))
Dim resultDate As Date
resultDate = CDate(cleanStr)
用語解説:Trim関数
文字列の前後にある空白(スペースやタブ)を取り除くVBAの関数。用語解説:StrConv関数
文字列を全角・半角や大文字・小文字に変換できるVBAの関数。vbNarrowで半角化。
(日付型エラーやSQL日付処理の失敗回避については『SQL日付関数の完全ガイド|現場で使えるテンプレ・失敗回避法も解説』もご参照ください)
4-2. OS地域設定と異なる書式
- 例:OSが
yyyy/MM/ddなのに14-01-2024など - 対策: 可能ならISO 8601(
yyyy-MM-dd)に統一する
4-3. 存在しない日付
- 例:
2024/02/30はNG - 対策: IsDateで事前チェックを徹底
Dim dateStr As String
dateStr = "2024/2/30"
If IsDate(dateStr) Then
Debug.Print CDate(dateStr)
Else
Debug.Print "有効な日付文字列ではありません。"
End If
用語解説:IsDate関数
文字列や値が「有効な日付」として認識できるかどうかを判定するVBAの関数。
5. 応用・発展テクニック
5-1. 配列で一括処理してスピードUP
数百〜数千件の変換は、セル操作より配列でまとめて処理→一括書き戻しが鉄則。
(AIやVBAを活用したExcel業務効率化については『VBA×AIでExcelシート情報伝達率98%!CSV変換・ワイヤーフレーム出力の全手順』もご参照ください)
5-2. N日後・Nヶ月後・月末日の計算
- N日後/Nヶ月後:DateAddで柔軟に
- 月末日:DateSerial(Year(d), Month(d) + 1, 1) – 1 で一発取得
用語解説:DateAdd関数
日付に「日・月・年」などを加算できるVBAの関数。将来日や過去日を簡単に計算できる。用語解説:DateSerial関数
年・月・日を指定して日付(Date型)を作るVBAの関数。月末日計算にも便利。
5-3. Power Queryとの比較
定型データならPower QueryのGUI変換も選択肢。
複雑ロジックはVBAで、うまく使い分けましょう。
用語解説:Power Query
Excelに搭載されたデータ変換・集計ツール。GUI操作でデータ加工ができ、VBAよりも簡単な場合も多い。
6. よくある質問(FAQ)
-
Q1. Format関数の書式指定子(m/mm、d/ddなど)の違いは?
A. mは「1」「12」のように可変、mmは「01」「12」と必ず2桁。ファイル名用途など桁を揃えたい時はmmやdd推奨。
-
Q2. CDateで意図しない年(29年→2029年)が出るのは?
A. 2桁年の解釈はOS設定依存です。「2029年までを21世紀」などのロジックなので、年は必ず4桁で! -
Q3. ISO 8601形式(yyyy-mm-ddThh:mm:ss+09:00)で出力するには?
A. Format(Now, “yyyy-mm-dd””T””hh:mm:ss”) & “+09:00” のように固定文字列は二重引用符で挟みます。 -
Q4. Excelの表示形式とVBAの変換の違いは?
A. Excelの表示形式は“見た目”だけを変更、本体はシリアル値。VBAのFormatは、本当に「文字列」に変換する点が違います。 -
Q5. ループで毎回Formatを呼ぶと遅くなる?
A. 大量処理ならパフォーマンスに影響。応用編で紹介した配列テクで高速化しましょう。
まとめ・一言
日付と文字列変換の仕組みと使い分け、エラーの回避法を押さえれば、
VBAの実務はグッと楽になります。
まずは手元のプロジェクトで、1つでも動かしてみてください。