テーブル内の8ケタの数字を日付に変換
前回まで、テーブル間の転記についてあれこれとマクロを作ってみた。
infoment.hatenablog.com
今日は、小ネタで閑話休題。
基幹システムなどからデータを受け取って成形するとき、個人的に頻繁に
遭遇するのが ↓ このパターン。
日付が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桁の数字が
転記され、↓ こんな表示になる場合を想定してのこと。
日付のシリアル値は1900年1月1日を1として、それから何日経ったかを
表している。例えば今日、2021年8月6日は、1900年1月1日を初日とした
44414日目となる。
Excelは今日現在、少なくとも私の環境(Excel365)で西暦9999年12月31日
(=2958465)までしか対応していない。従って例えば20210701を日付型に
しようとすると、表示しきれず上記のようになる。それを回避するため、
書式を一旦「標準」としてみた。
それでは、こちらで確認してみよう。
Sub TestNumToDate() NumToDate ActiveSheet.ListObjects("テーブルA"), "入荷日", "出荷日" End Sub
結果がこちら。
現在作成中のテーブル転記マクロと合わせて、業務などで強い味方になって
くれると期待している。
次回に続きます。
参考まで。