8桁の数字を日付に変換

何某かのシステムからダウンロードしたデータの日付が、8桁の数字になっていることがある。これを、日付データに変換したい。こんな感じで。
例)20191004 ⇒ 2019年10月4日
f:id:Infoment:20191004220750p:plain

ということで、覚えたての頃に作成したマクロと、
今日仕事で使ったものを両方書いてみよう。
f:id:Infoment:20191004221330p:plain

まずは、昔版(15年ぐらい前)。思い出しながら書いてみた。

Sub 日付変換_昔版()

 Dim myRng, r,,,, 日付
  Set myRng = Range(Range("A2"), Range("A" & Rows.Count).End(xlUp))
   For Each r In myRng
    年 = Left(r.Value, 4)= Left(Right(r.Value, 4), 2) ' Midの存在を知らなかった・・・。= Right(r.Value, 2)
    日付 = DateSerial(CInt(), CInt(), CInt())
    r.Offset(0, 1) = 日付
   Next r

End Sub

うむ、懐かしい。しかも、ちゃんと処理してくれる。だから、何も問題ない。
f:id:Infoment:20191004222258p:plain

ただし、データ量が数万行に及んでくると途端に、その処理速度の遅さに閉口することになる。

ついで、本日版のブログ用アレンジ版。

Sub ExchangeNumToDate()
    Dim myRng As Range
    Set myRng = Range(Cells(2, "A"), Cells(Rows.Count, "A").End(xlUp))
    
    Dim arr() As Variant
        arr = myRng.Value
        
    Dim i As Long
        For i = 1 To UBound(arr)
            arr(i, 1) = Format(arr(i, 1), "0000/00/00")
        Next
    With myRng.Offset(, 2)
        .Value = arr
        .NumberFormatLocal = "yyyy/mm/dd"
    End With
End Sub

f:id:Infoment:20191004223459p:plain

変わったところは、以下のとおり。

  1. 変数の型を宣言するようになった。
    某サイトの影響で、当時は宣言しないのが当たり前と思ってた。
  2. 一旦、配列格納し、配列内で処理するようになった。
  3. 数字から日付への変換は、一行で済ませるようになった。
  4. 配列から範囲への一括貼り付けでスピードアップ。
  5. 日付の桁を揃えるようになった(これは、好みの問題)。

さて来年の今頃は、果たしてどんな書き方になっていることやら。

参考まで。