8桁の数字を日付に変換
何某かのシステムからダウンロードしたデータの日付が、8桁の数字になっていることがある。これを、日付データに変換したい。こんな感じで。
例)20191004 ⇒ 2019年10月4日
ということで、覚えたての頃に作成したマクロと、
今日仕事で使ったものを両方書いてみよう。
まずは、昔版(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
うむ、懐かしい。しかも、ちゃんと処理してくれる。だから、何も問題ない。
ただし、データ量が数万行に及んでくると途端に、その処理速度の遅さに閉口することになる。
ついで、本日版のブログ用アレンジ版。
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
変わったところは、以下のとおり。
- 変数の型を宣言するようになった。
某サイトの影響で、当時は宣言しないのが当たり前と思ってた。 - 一旦、配列格納し、配列内で処理するようになった。
- 数字から日付への変換は、一行で済ませるようになった。
- 配列から範囲への一括貼り付けでスピードアップ。
- 日付の桁を揃えるようになった(これは、好みの問題)。
さて来年の今頃は、果たしてどんな書き方になっていることやら。
参考まで。