Excelでは固定長データのテキストファイルを読み込むことができます。読み込む前にデータの切れ目、カラム(列)を指定することで、テキストを分割してセルにセットされます。
しかし、読み込みの都度、カラムの指定をする必要があるので、同じ処理を繰り返す場合には面倒です。
あらかじめカラムを指定しておけば自動的に読み込むマクロを作ってみました。
テキストファイル
ab123cd45
ef456gh78
ij901kl23
ef456gh78
ij901kl23
このような固定長のテキストがあったとします。
これを「2桁、3桁、2桁、2桁」に分割するとします。つまり「ab123cd45」を「ab」「123」「cd」「45」にします。
マクロに「Const csv =」という行があります。ここに「Const csv = “2,3,2,2”」のように桁をカンマ区切りでセットします。
マクロを実行すると、ファイル選択のダイアログが出ますので、テキストファイルを選択します。
そして、テキストが指定した桁の通り分割されて、現在のシートの各セルにセットされます。
コード
Sub 固定長データ読み込み()
'テキストファイル(固定長データ)を読み込む。
'カラムの桁は「csv」にカンマ区切りでセットしておく。
Const csv = "2,3,2,2" '←ここを変える。
Dim file_name, n, my_line, parts, i
'ファイル(固定長データ)の選択
With Application.FileDialog(msoFileDialogFilePicker)
.Title = "ファイルを選択"
.AllowMultiSelect = False
.Show
file_name = .SelectedItems(1)
End With
'ファイルの読み込み
Cells.ClearContents
Open file_name For Input As #1
n = 1
Do Until EOF(1)
Line Input #1, my_line
parts = fixed_length_split(my_line, csv)
For i = 0 To UBound(parts)
Cells(n, i + 1) = parts(i)
Next i
n = n + 1
Loop
Close #1
End Sub
Function fixed_length_split(this_line, csv_length_column)
'固定長レコードを分割し配列で返す。
'this_line:固定長レコード
'csv_length_column:カラム幅をCSVで(2桁-3桁-2桁ならば"2,3,2")
Dim length_column, number_column, start_column, i
length_column = Split(csv_length_column, ",")
number_column = UBound(length_column)
ReDim recs(number_column)
start_column = 1
For i = 0 To number_column
recs(i) = Mid(this_line, start_column, length_column(i))
start_column = start_column + length_column(i)
Next i
fixed_length_split = recs
End Function
'テキストファイル(固定長データ)を読み込む。
'カラムの桁は「csv」にカンマ区切りでセットしておく。
Const csv = "2,3,2,2" '←ここを変える。
Dim file_name, n, my_line, parts, i
'ファイル(固定長データ)の選択
With Application.FileDialog(msoFileDialogFilePicker)
.Title = "ファイルを選択"
.AllowMultiSelect = False
.Show
file_name = .SelectedItems(1)
End With
'ファイルの読み込み
Cells.ClearContents
Open file_name For Input As #1
n = 1
Do Until EOF(1)
Line Input #1, my_line
parts = fixed_length_split(my_line, csv)
For i = 0 To UBound(parts)
Cells(n, i + 1) = parts(i)
Next i
n = n + 1
Loop
Close #1
End Sub
Function fixed_length_split(this_line, csv_length_column)
'固定長レコードを分割し配列で返す。
'this_line:固定長レコード
'csv_length_column:カラム幅をCSVで(2桁-3桁-2桁ならば"2,3,2")
Dim length_column, number_column, start_column, i
length_column = Split(csv_length_column, ",")
number_column = UBound(length_column)
ReDim recs(number_column)
start_column = 1
For i = 0 To number_column
recs(i) = Mid(this_line, start_column, length_column(i))
start_column = start_column + length_column(i)
Next i
fixed_length_split = recs
End Function
テキストファイルが毎回同じでダイアログで選択するのは面倒ということであれば「With ~ End With」の部分を「file_name = ファイル名」に書き替えてもよいです。ファイル名はパス付の方が無難でしょう。
処理結果
A | B | C | D | |
---|---|---|---|---|
1 | ab | 123 | cd | 45 |
2 | ef | 456 | gh | 78 |
3 | ij | 901 | kl | 23 |
コメント