Loading
  • LIGHT

  • DARK

ROUTE

ルートゼロの
アクティビティ

VBA日付文字列変換を完全理解|Format・CDateとエラー回避の原理

1

はじめに|この記事で得られる価値

VBAで日付文字列の変換、手が止まってしまった経験はありませんか?
「ファイル名にyyyymmdd形式の日付を入れたいのに、やり方が分からない…」
「文字列を日付にしようとCDateを使ったら、『型が一致しません』エラーでハマった…」
私たち現場の開発者が必ず一度は遭遇する悩みです。

この記事では、「なぜ?」に応えつつ、実務で使えるサンプルと“腹落ち”解説で一気に解決します。
Format/CDateの使い分けや、エラーの原因・対策まで、
やりたいことから探せる逆引き形式+「なぜ動くのか」の理屈も丁寧にカバー。
この記事で、日付と文字列変換の疑問を一緒にスッキリ解決しましょう。

(VBAの基礎や現場活用については『SES現場でVBAできますか?未経験向けExcelマクロ実践術』もご参照ください)


1. シリアル値とは?VBA日付処理の大原則

「Excelで日付をどう管理しているか」、意外と知られていません。
実はシリアル値という「日付を数字で持つ仕組み」がカギです。

  • 1900/1/11
  • 2024/1/1445305
  • 2024/1/14 12:0045305.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
  • 対策: TrimStrConvでスペース削除&半角変換

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桁。ファイル名用途など桁を揃えたい時はmmdd推奨。
  • 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つでも動かしてみてください。


もっとルートゼロを知りたいなら

DISCOVER MORE