テーブル内の8ケタの数字を日付に変換

前回まで、テーブル間の転記についてあれこれとマクロを作ってみた。
infoment.hatenablog.com
今日は、小ネタで閑話休題
f:id:Infoment:20210806220715p:plain
基幹システムなどからデータを受け取って成形するとき、個人的に頻繁に
遭遇するのが ↓ このパターン。

日付がyyyymmdd(数字8桁)でセットされている

例えば「20210806」は、「2021年08月06日」を意味している。
これを毎回日付に直すのが、結構面倒だったりする。

そこで今回、テーブル間の転記を行うついでに、8桁の数字を日付型に変換する
マクロを作ってみた。金額など、8桁であって日付でない場合もあるだろうから、
今回はテーブルでラベル名を指定し、列単位で変換することにした。

Function NumToDate(target_tb As ListObject, ParamArray target_column() As Variant) As Excel.ListObject

    Dim TargetRange As Range
    Dim arr As Variant
    Dim i As Long
    Dim c As Long
    Dim temp As Variant
    
        If IsMissing(target_column) Then Exit Function
        
        For c = 0 To UBound(target_column)
            Set TargetRange = target_tb.ListColumns(CStr(target_column(c))).DataBodyRange
            If Not TargetRange Is Nothing Then
            
                TargetRange.NumberFormatLocal = "G/標準"
                arr = TargetRange
                
                For i = 1 To UBound(arr)
                    temp = arr(i, 1)
                    If temp = vbNullString Then
                    ElseIf Not IsNumeric(temp) Then
                    ElseIf Len(temp) = 8 Then
                        arr(i, 1) = Format(temp, "0000/00/00")
                    End If
                Next
                
                TargetRange = arr
                TargetRange.NumberFormatLocal = "yyyy/mm/dd"
            End If
        Next
        
    Set NumToDate = target_tb
        
End Function

列単位で書式を一旦「標準」にするのは、日付型の書式列に8桁の数字が
転記され、↓ こんな表示になる場合を想定してのこと。
f:id:Infoment:20210806221550p:plain

日付のシリアル値は1900年1月1日を1として、それから何日経ったかを
表している。例えば今日、2021年8月6日は、1900年1月1日を初日とした
44414日目となる。

Excelは今日現在、少なくとも私の環境(Excel365)で西暦9999年12月31日
(=2958465)までしか対応していない。従って例えば20210701を日付型に
しようとすると、表示しきれず上記のようになる。それを回避するため、
書式を一旦「標準」としてみた。

それでは、こちらで確認してみよう。
f:id:Infoment:20210806223030p:plain

Sub TestNumToDate()
    NumToDate ActiveSheet.ListObjects("テーブルA"), "入荷日", "出荷日"
End Sub

結果がこちら。
f:id:Infoment:20210806223259g:plain

現在作成中のテーブル転記マクロと合わせて、業務などで強い味方になって
くれると期待している。

次回に続きます。

参考まで。