エクセルのクエリテーブルオブジェクトを使い、データを読み込んだ時の数値の扱いについてです。
テキストファイルのデータの桁数が多い場合、一般形式でエクセルにインポートするとデータが切れます。
以下はサンプルで適当に作った数字です。項目A~項目Cまでは小数点のある数字です。

目次
一般形式でインポート
データ型を指定しないでインポートした場合は、一般形式で読み込まれます。
サンプルコード
Sub sample1()
Dim dPath As String: dPath = "F:\sample\data1.txt"
Dim ws As Worksheet: Set ws = ActiveSheet
Dim imData As QueryTable
Set imData = ws.QueryTables.Add(Connection:="TEXT;" & dPath, _
Destination:=ws.Range("A1"))
With imData
.TextFilePlatform = 65001
.TextFileParseType = xlFixedWidth
.TextFileFixedColumnWidths = Array(18, 20, 20, 20)
.Refresh
.Delete
End With
End Sub
読込み結果
2行目はテキストファイルから読込んだ結果です。
3行目はもとのテキストファイルの数値です。

インポートしたデータは数字がすべて表示されていないだけです。

しかし小数点以下の表示桁数を増やしても15桁までしか表示できません。これは入力できる数値の最大桁数が15桁だからです。

テキスト形式でインポート
項目A~Cをテキスト形式でインポートした場合です。
サンプルコード
Sub sample2()
Dim dPath As String: dPath = "F:\sample\data1.txt"
Dim ws As Worksheet: Set ws = ActiveSheet
Dim imData As QueryTable
Set imData = ws.QueryTables.Add(Connection:="TEXT;" & dPath, _
Destination:=ws.Range("A1"))
With imData
.TextFilePlatform = 65001
.TextFileParseType = xlFixedWidth
.TextFileColumnDataTypes = Array(1, 2, 2, 2)
.TextFileFixedColumnWidths = Array(18, 20, 20, 20)
.Refresh
.Delete
End With
End Sub
実行結果
もとのテキストファイルと同じ数字で取り込まれます。

11行目の「TextFileColumnDataTypes 」で指定します。
スクロールできます
| 値 | 定数 | 形式 |
|---|---|---|
| 1 | xlGeneralFormat | 一般 |
| 2 | xlTextFormat | テキスト |
| 3 | xlMDYFormat | 日付・MDY |
| 4 | xlDMYFormat | 日付・DMY |
| 5 | xlYMDFormat | 日付・YMD |
| 6 | xlMYDFormat | 日付・MYD |
| 7 | xlDYMFormat | 日付・DYM |
| 8 | xlYDMFormat | 日付・YDM |
| 9 | xlSkipColumn | 読込まない |
| 10 | xlEMDFormat | 日付形式・EMD(台湾年月日) |
テキストファイルのデータが指数表示の場合
文字列で読込めばすべての桁数でで表示できますが、もとのデータが指数表示だった場合はどうなるか。
項目Cが指数表示の場合、以下のように表示されます。

この後、このデータを使い計算結果を利用する場合、このままの表示では困ります。
数値をどう扱うかでやり方は変わります。
例えば、読み込みデータと計算結果は小数点以下8桁までしか使用しないなら、以下の方法で対応できます。
- データを読み込んだ後に「NumberFormatLocal = "0.00000000"」でデータの桁数をそろえる
- 計算結果の値をRound関数等で小数点以下8桁までの結果にする

