【Excel VBA】8桁の数字を日付に変換する方法|YYYYMMDD・文字列にも対応

みなさんこんにちは。

Excel VBAでデータを扱っていると、

「20241021」

のようなYYYYMMDD形式の8桁の数字を、

「2024/10/21」

のような日付へ変換したい場面があるかと思います。

Excel上であれば表示形式を変更するだけで対応できるケースもありますが、VBAで取得した値を日付として計算したり、別のセルへ出力したりする場合は、Date型へ変換しておくと扱いやすくなります。

今回は、8桁の数字やYYYYMMDD形式の文字列をExcel VBAで日付へ変換する方法についてご紹介したいと思います。

この記事はこんな人におすすめ

この記事はこんな人におすすめです!

  • Excel VBAで8桁の数字を日付に変換したい人
  • YYYYMMDD形式の文字列を日付へ変換したい人
  • 20241021 を 2024/10/21 の形式で表示したい人
  • VBAで日付データを扱う方法を知りたい人

それでは実際に確認していきましょう。

初学者向けの過去記事

VBA初学者のための関連項目については過去の記事でもご紹介しております。

8桁の数字を日付に変換する方法

今回は、A1セルに入力されている次の値を使用します。

20241021

この値をVBAで変換し、

A2セルには、

2024/10/21

A3セルには、

令和6年10月21日

と出力してみます。

ExcelのA1セルにYYYYMMDD形式の8桁の日付「20241021」を入力した例

YYYYMMDD形式を日付へ変換するサンプルコード

今回使用するサンプルコードは以下となります。

Sub ConvertYyyymmddToDate()

    Dim ws As Worksheet
    Dim strDate As String
    Dim targetDate As Date
    Dim iYear As Integer
    Dim iMonth As Integer
    Dim iDay As Integer

    '========================================
    ' 処理対象となるワークシートを取得する
    '========================================
    Set ws = ThisWorkbook.Worksheets("Sheet1")

    '========================================
    ' A1セルからYYYYMMDD形式の日付を取得する
    '========================================
    strDate = Trim(CStr(ws.Range("A1").Value))

    '8桁の数字になっているか確認する
    If Len(strDate) <> 8 Or Not IsNumeric(strDate) Then
        MsgBox "A1セルにはYYYYMMDD形式の8桁の数字を入力してください。", vbExclamation
        Exit Sub
    End If

    '========================================
    ' YYYYMMDDから年・月・日を取り出す
    '========================================
    iYear = CInt(Left(strDate, 4))
    iMonth = CInt(Mid(strDate, 5, 2))
    iDay = CInt(Right(strDate, 2))

    '========================================
    ' 年・月・日からDate型の日付を作成する
    '========================================
    On Error GoTo DateError

    targetDate = DateSerial(iYear, iMonth, iDay)

    'DateSerialによって存在しない日付が補正されていないか確認する
    If Format(targetDate, "yyyymmdd") <> strDate Then
        GoTo DateError
    End If

    On Error GoTo 0

    '========================================
    ' A2セルへYYYY/MM/DD形式で出力する
    '========================================
    ws.Range("A2").NumberFormat = "yyyy/mm/dd"
    ws.Range("A2").Value = targetDate

    '========================================
    ' A3セルへ和暦形式で出力する
    '========================================
    ws.Range("A3").NumberFormatLocal = "ggge年m月d日"
    ws.Range("A3").Value = targetDate

    MsgBox "日付への変換が完了しました。", vbInformation

    Exit Sub

DateError:

    'エラー処理を解除する
    On Error GoTo 0

    '日付として変換できなかった場合にメッセージを表示する
    MsgBox "A1セルには実在する日付をYYYYMMDD形式で入力してください。", vbExclamation

End Sub

※今回のサンプルでは、対象となるシート名を「Sheet1」としています。実際に使用する場合は、ご自身のExcelファイルのシート名に変更してください。

コードの解説

今回の処理では、まずA1セルの値を文字列として取得しています。

strDate = Trim(CStr(ws.Range("A1").Value))

CStrを使用することで、A1セルが数値として入力されている場合でも文字列として扱うことができます。

続いて、8桁のYYYYMMDD形式から年・月・日をそれぞれ取得します。

iYear = CInt(Left(strDate, 4))
iMonth = CInt(Mid(strDate, 5, 2))
iDay = CInt(Right(strDate, 2))

それぞれ、

Left(strDate, 4) で年、

Mid(strDate, 5, 2) で月、

Right(strDate, 2) で日を取得しています。

今回の 20241021 であれば、

年:2024
月:10
日:21

に分けられます。

DateSerialで日付型へ変換する

取り出した年・月・日は、DateSerial関数を使用してDate型へ変換します。

targetDate = DateSerial(iYear, iMonth, iDay)

文字列を単純に / で結合する方法でも表示することはできますが、VBA内部で日付として扱うのであれば、Date型へ変換しておく方が便利です。

Date型にしておけば、その後の日付計算や比較処理にも利用できます。

また今回のコードでは、存在しない日付が入力された場合に備えて、

If Format(targetDate, "yyyymmdd") <> strDate Then
    GoTo DateError
End If

というチェックも行っています。

例えば存在しない日付が入力された場合に、そのまま別の日付として処理されることを防ぐためです。

YYYYMMDD形式の文字列でも変換できる

今回の方法は、

20241021

が数値として入力されている場合だけではなく、文字列として保存されている場合にも利用できます。

最初に、

CStr(ws.Range("A1").Value)

で文字列へ変換してから処理しているためです。

そのため、CSVファイルや外部システムから取得したYYYYMMDD形式の日付をExcelへ取り込んだ場合にも応用できます。

YYYY/MM/DD形式でセルへ出力する

A2セルでは、セルの表示形式を次のように設定しています。

ws.Range("A2").NumberFormat = "yyyy/mm/dd"

その後、Date型へ変換した値を代入します。

ws.Range("A2").Value = targetDate

これで、

20241021

という8桁の値を、

2024/10/21

として表示できます。

和暦で表示する方法

同じ日付を和暦で表示したい場合は、セルの表示形式を変更します。

ws.Range("A3").NumberFormatLocal = "ggge年m月d日"
ws.Range("A3").Value = targetDate

今回の例では、

令和6年10月21日

と表示されます。

日付そのものは同じDate型ですが、セルの表示形式を変更することで、西暦と和暦を使い分けることができます。

Excel VBAで20241021を2024/10/21と令和6年10月21日に変換した結果

8桁の日付を変換するときの注意点

YYYYMMDD形式のデータを扱う場合は、単純に8桁であればよいというわけではありません。

例えば、

20240231

のように、実際には存在しない日付が入力される可能性もあります。

業務で使用するツールの場合は、今回のサンプルのように、

  • 8桁になっているか
  • 数字だけで構成されているか
  • 実際に存在する日付か

まで確認しておくと安全です。

また、UserForm上で日付を入力させる場合は、TextBoxへ直接入力させるだけでなく、カレンダーから日付を選択できるようにする方法もあります。

UserFormでの日付入力については、以下の記事でも紹介しています。

【Excel VBA】UserFormにカレンダー形式の日付選択コントロールを作成する方法

最後に

いかがでしたでしょうか。

今回は、Excel VBAを使用してYYYYMMDD形式の8桁の数字や文字列を日付へ変換する方法についてご紹介しました。

8桁の日付データは、CSVファイルや外部システムから取得したデータなどでもよく使用される形式です。

Left、Mid、Rightで年・月・日を取得し、DateSerialでDate型へ変換しておけば、その後の日付計算や比較処理にも利用しやすくなります。

日付変換が必要になった際に、少しでも参考になれば幸いです。

開発依頼について

ココナラでWebスクレイピング開発サービスを出品しております。

自分で開発をしようと思ったけど、依頼したり、何か聞きたいことがあったりしたら

いつでもお気軽にご相談ください。

また、本ブログからご依頼いただいた方については割引特典がございますので、

ご不明点と合わせてメッセージをいただけると幸いです。

Excelにてブラウザ操作自動化ツールを作成します その作業、webスクレイピングを使って自動化しましょう!

ご興味がある方はこちら!!

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

CAPTCHA