一旦配列に格納したのちに処理したときの失敗談

例えばある列に、8桁の整数が入力されているとする。
f:id:Infoment:20190316214420p:plain

これらは年月を表しており、年4桁+月2桁+日2桁となっている(yyyymmdd)。これをDate型に切り替えるために、以下のようなマクロを作成した。

Sub test()
    Dim myRng As Range
        Set myRng = ActiveSheet.ListObjects(1).ListColumns("年月").DataBodyRange
    Dim seq As Variant
        seq = myRng.Value
        ' 二次元配列を一次元配列に変換。
        seq = WorksheetFunction.Transpose(seq)
        
    Dim i As Long
        For i = 1 To UBound(seq)
            seq(i) = Left(seq(i), 4) & "/" & Mid(seq(i), 5, 2) & "/" & Right(seq(i), 2)
        Next
        
        myRng = WorksheetFunction.Transpose(seq)
End Sub

実行してみると、意図したとおりに処理してくれた。
f:id:Infoment:20190316215707p:plain

ところがある時、エラーが発生した。
f:id:Infoment:20190316215830p:plain

デバックしてみると、ここでエラーが発生している。
f:id:Infoment:20190316215906p:plain

色々と調べてみて、原因が分かった。分かったというか、当然と言えば当然の話だった。エラーが起きたデータは、レコードが一つしかなかったのだ。
f:id:Infoment:20190316220008p:plain

複数の値があるから、配列になる。しかし値が一つしかないならば、seqはDouble型の変数として振舞ってしまうわけで。
f:id:Infoment:20190316220133p:plain

これを配列であるかのように扱ったことが、今回のエラーの原因だった。
対処法は色々とあるだろうが、今回は

If IsArray(seq) Then

で配列か否かを確認して、処理を行った。

それにしてもこの失敗、定期的に起こしているような気がする。
来年の今頃に、また同じような内容のブログを書いているかもしれません。

参考まで。