「
やっとできたぞ!その2」で書いたマクロ、かなり遅いので別の案を最近になって考えていました、
はじめに書いたのがこれ、↓
Sub お馬鹿なAS400の日付を直す1()
'1070131 形式の日付データを 2007/01/31 の日付形式に変換する。
Dim 日付 As Variant
With Application
.ScreenUpdating = False
For Each 日付 In Selection
If 日付 = "" Then Exit For
日付.Value = 日付.Value + 19000000
日付.Value = Left(日付, 4) & "/" _
& Mid(日付, 5, 2) & "/" _
& Right(日付, 2)
Next
Selection.Columns.AutoFit
.ScreenUpdating = True
End With
End Sub
次に書いたのがこれ、↓
Sub お馬鹿なAS400の日付を直す2()
'1070131 形式の日付データを 2007/01/31 の日付形式に変換する。
Dim 行 As Integer
Dim 範囲 As Range
Dim 日付 As Variant
With Application
.ScreenUpdating = False
行 = Range("A1").CurrentRegion.Rows.Count
Set 範囲 = Range(Cells(1, 1), Cells(行, 1))
For Each 日付 In 範囲
日付.Value = DateSerial(Left(日付, 3) + 1900, _
Mid(日付, 4, 2), Right(日付, 2))
Next
範囲.Columns.AutoFit
.ScreenUpdating = True
End With
End Sub
そして最近考えたのが次のやつ、
Sub お馬鹿なAS400の日付を直すその3()
'1070131 形式の日付データを 2007/01/31 の日付形式に変換する。
'これが一番早い
Dim 日付 As Variant
Dim 開始列 As Variant
Dim 最終列 As Variant
'画面更新停止
For Each 日付 In Selection 'Excelが理解できるように整形
日付.Value = 日付.Value + 19000000
Next
With Selection
開始列 = .Column
最終列 = .Columns(.Columns.count).Column
'Excel標準機能の「区切り位置」機能を使う
For i = 開始列 To 最終列 '複数列処理不可、一列ごとに処理する
Columns(i).TextToColumns _
DataType:=xlDelimited, _
textqualifier:=xlDoubleQuote, _
fieldinfo:=Array(1, 5)
Next i
.Columns.AutoFit '列幅を最大文字数に合わせる
End With
.ScreenUpdating = True
End With
End Sub
それを
「Celeron 2.66GHz 512KB RAM」
「Windows2000」
「Excel2000」
という恐ろしく遅い職場のロートル・マシンで上記マクロの処理時間を計ったら・・・、
A列すべてに「1091231」というデータを入力し、「2009/12/31」という日付に変換し終わるまでそれぞれ2回ずつ走らせた結果上から順番に
「27秒」
「18秒」
「12秒」
となりました。
最初のは完全に力業、2番目は日付関数を使ったのでそれより少しスマートで早いですがセルごとの処理なのでまだ遅い、、3番目も「1091231」を「20091231」にするのは同じく力業に頼らざるを得なかったのですがExcel標準機能の「区切り位置」機能を使いました、これは列単位の処理なのでほぼ一瞬で「2009/12/31」に変換できるのです。
だが欠点、というほどのもではないのですが前出の2者はセル単位で処理できますが、つまり飛び飛びに選択した範囲も変換可能ですが後者はあくまでも列単位、複数列も可能ですがその場合、必ず隣接していないと変換してくれません、本来の目的なのでこれで良しとしましょう。