和風スパゲティのレシピ

日本語でコーディングするExcelVBA

日付(Date)とyyyymmdd(Long)を相互変換する

2025/10/31のような日付(Date型)と20251031のような数値(Long型)を、
相互に変換する方法を解説します。

TEXT関数のVBA版である、Format関数を使用します。

日付型(Date型)をyyyymmddに変換する

基本構文

yyyymmdd値 = Format(日付, "yyyymmdd")

サンプルコード

Dim yyyymmdd値 As Long

' 文字列(String)型の日付をyyyymmddに変換
yyyymmdd値 = Format("2025/4/1", "yyyymmdd") ' 20250401

' 日付(Date)型をyyyymmddに変換
yyyymmdd値 = Format(DateSerial(2025, 4, 1), "yyyymmdd") ' 20250401

' セル値をyyyymmddに変換
' (セル値はシリアル値でも文字列でもOK)
yyyymmdd値 = Format(Range("A1"), "yyyymmdd") ' 20250401

' 本日の日付をyyyymmddで取得
yyyymmdd値 = Format(Date, "yyyymmdd") ' 20251031

解説

日付をyyyymmddの8桁数値に変換するにはFormat関数を使用します。

Format関数はワークシート関数の「TEXT」と同じ仕様の関数で、
値と形式を渡すと表示形式に則った文字列を返してくれる関数です。


値は日付型(シリアル値)でも文字列型でもどちらでも大丈夫で、
いずれの場合もyyyymmddの形式にして返してくれます。


もちろんセル値が「あいう」など日付と判定できない文字列だった場合は、
TEXT関数と同様そのまま「あいう」を返してしまいます。

サンプルのようにLong型変数にその結果を入れようとした場合は、

実行時エラー '13':
型が一致しません。

エラーとなりますのでご注意ください。

yyyymmddを日付型(Date型)に変換する

基本構文

Date型日付 = Format(yyyymmdd値, "@@@@/@@/@@")

サンプルコード

' 日付型に変換
Date型日付 = Format(20250401, "@@@@/@@/@@") ' 2025/04/01

' セル値が正しいyyyymmdd形式か確認してから変換
If IsDate(Format(Range("A1"), "@@@@/@@/@@")) Then
    Date型日付 = Format(Range("A1"), "@@@@/@@/@@") ' 2025/04/01
Else
    MsgBox "対象のセル値が正しいyyyymmdd形式ではありません。"
End If

解説

yyyymmdd形式の8桁数値をDate型の日付に変換する場合は、
Format関数で5桁目と7桁目にスラッシュを挿入した文字列に変換します。

表示形式における「@」は文字列を表しますが、
たくさん並べると「第n文字目」を指定することができます。


コードとしては簡単なのですが注意点がいくつかあり、
まずはこのコードは対象がyyyymmddでなくても動きます。

Format("あいうえおかきく", "@@@@/@@/@@") ' あいうえ/おか/きく が返ります。

対象が数値でない可能性がある場合は、
サンプルのように「IsDate」で判定をした方が安全です。


また、この「@@@@/@@/@@」の記述は8文字でなくても動き、
文字数が少ない場合、多い場合は少し不思議な挙動になります。

Format("あいうえ", "@@@@/@@/@@") 「 /あい/うえ」
Format("あいうえおか", "@@@@/@@/@@") 「 あい/うえ/おか」
Format("あいうえおかきくけ", "@@@@/@@/@@") 「あいうえ/おか/きくけ」

"000"などで0埋めができるのと同様、
足りない分は半角スペースで埋められはみ出た分は右側に追加されます。

一応「250401」も同じように変換してくれますがご注意ください。


システムから出力したCSVなど、確実にyyyymmddである場合はいいのですが、
桁が8桁でない可能性がある場合には「8桁の数値」であることを判定してください。

' セル値が正しいyyyymmdd形式か確認してから変換
Dim yyyymmddセル As Range
Set yyyymmddセル = Range("A1")

If IsNumeric(yyyymmddセル) Then
    If Len(CStr(yyyymmddセル)) = 8 Then
        If IsDate(Format(yyyymmddセル, "@@@@/@@/@@")) Then
            Date型日付 = Format(yyyymmddセル, "@@@@/@@/@@") ' 2025/04/01
            Debug.Print Date型日付
        Else
            MsgBox "対象のセル値が正しいyyyymmdd形式ではありません。"
        End If
    End If
End If