Excelは便利な反面、外部ファイルを開いた際にデータを自動で数値や日付に変換してしまうという厄介な特性があります。たとえば、識別コード「A01」は「A1」に、区画番号「B-01」は「B/1」(日付)として扱われてしまうことがあります。
本記事では、VBAを使って固定長テキストファイルを読み込み、値を一切変換せずにそのままExcelに取り込む方法をご紹介いたします。
目次
読み込み対象のファイル構成
以下のような固定長テキストファイル(例:autoconvertdata.txt
)を読み込むと想定します。各データは桁位置によって区切られています。
A01 B-01 20250725 PROD-XYZ 12345 **不要列**
A02 B-02 20250726 ITEM-123 98765 **不要列**
このようなファイルを、識別コードや区画番号を変換せずにそのままの値として読み込むのが目的です。
VBAコード:固定長データを文字列として正確に読み込む
Sub ImportFixedFileWithoutConversion()
Dim filePath As String
filePath = ThisWorkbook.Path & "\autoconvertdata.txt"
Workbooks.OpenText _
Filename:=filePath, _
DataType:=xlFixedWidth, _
FieldInfo:=Array( _
Array(0, xlTextFormat), _
Array(6, xlTextFormat), _
Array(10, xlYMDFormat), _
Array(20, xlTextFormat), _
Array(40, xlGeneralFormat), _
Array(49, xlSkipColumn))
ActiveSheet.Range("A1").CurrentRegion.EntireColumn.AutoFit
End Sub
各パラメータの意味
FieldInfo
で指定している内容
開始位置 | 表示形式 | 例(変換せずに保持される値) | 備考 |
---|---|---|---|
0 | xlTextFormat | A01 | 識別コード、先頭ゼロあり |
6 | xlTextFormat | B-01 | 区画番号など |
10 | xlYMDFormat | 20250725 | 日付列として扱いたい |
20 | xlTextFormat | PROD-XYZ | 商品コードなど |
40 | xlGeneralFormat | 12345 | 数値として扱いたい項目 |
49 | xlSkipColumn | ― | 不要な列は読み飛ばす |
実行結果イメージ(Excel)
識別コード | 区画番号 | 日付 | 商品コード | 金額 |
---|---|---|---|---|
A01 | B-01 | 2025/07/25 | PROD-XYZ | 12345 |
A02 | B-02 | 2025/07/26 | ITEM-123 | 98765 |
注意点
xlTextFormat
を使うことで、Excelによる自動変換(数値化・日付化)を防止できます。xlYMDFormat
を使うと、日付列のみ適切に認識されます(YYYYMMDD形式)。- 読み飛ばしたい列は
xlSkipColumn
を指定することで、取り込まずに無視できます。 - 全角文字やUTF-8エンコードには対応していない場合がありますので、その際は別の処理が必要です。
応用のヒント
- CSVファイルでも同様の問題が発生するため、
Workbooks.OpenText
はCSV読み込みにも応用できます。 - 取込後にフォントや罫線を整える処理を追加すれば、そのまま報告資料として利用可能です。
FieldInfo
の配列は柔軟に変更できますので、実務のフォーマットに合わせて調整してください。
まとめ
Excelで固定長ファイルを読み込む際、「A01」や「B-01」などの重要な文字列が勝手に変換されてしまうのを防ぐには、VBAによる制御が不可欠です。本記事で紹介した FieldInfo
の使い方をマスターすれば、意図しない変換を防ぎ、正確なデータ処理が可能になります。
Excel業務で「開いたら値が変わっていた」というお悩みをお持ちの方は、ぜひお試しください。