Accessのテーブルやクエリをテキスト(CSV)にエクスポートすると、テーブルでは「0.12345」だった値が、CSVでは「0.12」になっていることがあります。たいていはデータが壊れたわけではありません。数値を文字に変えて書き出すときのルールが原因です。保存されている値、フィールドの型と書式、Windowsの地域設定の順に確認します。必要なら、クエリで出力用の文字列を作ってから出力します。
まず、どこで桁が変わったかを確かめる
桁が変わったのが「保存したとき」「出力したとき」「表示したとき」のどれなのかを切り分けます。
- 出力したCSVをメモ帳で開き、実際に書かれている値を見る。Excelで開くとExcelの表示形式で桁が変わって見えることがあるので、確認には使いません。
- Accessで新しいクエリを作り、確認したいフィールドを文字列に変えた列を追加して、保存されている値を見る。
SELECT 商品コード, 単価, CStr([単価]) AS 単価_確認
FROM T_商品;
テーブルのデータシートは書式プロパティに沿って表示されるので、保存されている値と見た目が違うことがあります。CStrで文字列にすれば、書式の影響を受けずに値を確かめられます。
- 結果を次の表に当てはめます。
| 保存されている値(CStr) | CSV(メモ帳) | 考えられる原因 |
|---|---|---|
| 小数がない | 小数がない | 保存した時点で小数が失われている → 確認1 |
| 0.12345 | 0.12 | 出力するときの変換 → 確認2・確認3 |
| 0.12345 | 0.12345 | Accessは正しく出力している。Excelなど、開いた側の表示を確認する |
確認1:フィールドの型とフィールドサイズ
テーブルをデザインビューで開き、該当するフィールドを確認します。
- データ型が「数値型」で、フィールドサイズが「長整数型」「整数型」「バイト型」の場合、小数は保存できません。インポートや入力の時点で整数に丸められているので、出力の設定を変えても小数は戻りません。
- フィールドサイズが「単精度浮動小数点型」の場合、扱える有効桁数が少ないため、桁の多い値は保存するときに誤差が出ることがあります。
- 小数を正確に保存したい場合は、「倍精度浮動小数点型」「十進型」「通貨型」などから、用途に合う型を選びます。
フィールドサイズを変えても、すでに失われた小数は戻りません。型を直してから、元データを取り込み直します。既存のテーブルの型を変える前に、データベースファイルのバックアップを取ってください。
確認2:書式・小数点以下表示桁数とエクスポートの設定
フィールドの「書式」プロパティ(「固定」「標準」など)と「小数点以下表示桁数」は、表示のための設定です。エクスポートの最初の画面で「書式設定とレイアウトを保持したままデータをエクスポートする」にチェックを入れると、この書式どおりの見た目で書き出されます。そのため、小数点以下2桁などに丸まった値が出力されることがあります。
このチェックを入れたままだと、区切り文字を指定する手順を通らず、CSVとは違う形式で出力されることもあります。区切り文字で区切ったCSVとして出したい場合はチェックを外し、出力したファイルをメモ帳で確認します。チェックを外しても桁が丸まる場合は、確認3に進みます。
確認3:Windowsの地域設定(小数点以下の桁数)
書式を保持しない通常のテキストエクスポートでも、数値型のフィールドが小数点以下2桁に丸められることがあります。影響しているのは、Windowsの地域設定にある「小数点以下の桁数」です。Accessはテキストに出力するとき、浮動小数点型などの数値をこの設定に沿って文字に変えることがあり、既定の「2」のままだと2桁に丸められます。Accessのバージョンやフィールドの型によって動きが違う場合もあります。設定を変える前と後で出力を比べて確かめてください。
設定の場所:
- Windowsキー+Rで「ファイル名を指定して実行」を開き、
intl.cplと入力してEnterキーを押す。 - 「地域」の画面で「追加の設定」をクリックする。
- 「数値」タブの「小数点以下の桁数」と「小数点の記号」を確認する。
ここを「2」より大きい値に変えると、出力される桁数が変わるかどうかを確かめられます。ただし、この設定はパソコン全体の表示に影響し、ほかのアプリでの数値の見え方も変わります。別のパソコンや別のユーザーが出力すれば、その環境の設定で結果が変わります。原因を確かめるのには使えますが、毎回同じ桁数で出したい運用には向きません。次に説明するクエリでの指定を使ってください。
対処:クエリで出力用の文字列を作ってから出力する
テーブルを直接エクスポートするのはやめて、出力用のクエリを作ります。小数を含むフィールドを関数で文字列にしてから書き出します。文字列にした値は、地域設定の「小数点以下の桁数」で丸められません。
関数の選び方
| 書き方 | 0.12345 の出力 | 2 の出力 | 向いている場面 |
|---|---|---|---|
Format([単価],"0.00000") |
0.12345 | 2.00000 | 取り込み先が桁数の固定を求めている |
CStr([単価]) |
0.12345 | 2 | 保存されている値の桁をそのまま出したい |
Trim(Str([単価])) |
.12345 になる場合がある | 2 | 小数点を必ず「.」にしたい |
それぞれの注意点:
- Format:指定した桁数で丸めます。保存されている値より少ない桁数を指定すると、その桁で丸められます。「0.#####」のように「#」を使うと、整数の値が「2.」のように小数点で終わることがあるので、出力を確認してください。
- CStr:とても小さい値や大きい値は、「1E-05」のような指数表記になることがあります。取り込み先が指数表記を読めるか確認してください。
- Str:正の数の先頭に符号用の空白が入るので、Trimで取り除きます。0.5が「.5」のように、先頭の0がない形で返る場合があります。
- FormatとCStrの小数点の記号は、Windowsの地域設定に従います。「小数点の記号」が「.」以外になっている環境で出力するときは注意してください。
クエリの例
SELECT
T_商品.商品コード,
T_商品.商品名,
IIf([T_商品].[単価] Is Null, Null, Format([T_商品].[単価], "0.00000")) AS 単価
FROM T_商品;
- 値が空(Null)のレコードにCStrを使うとエラーになります。この例では、IIfを使ってNullのときはNullのまま返しています。
- 別名(ASの後ろの名前)を元のフィールド名と同じにすると、「循環参照」のエラーになることがあります。式の中でテーブル名を付けて
[T_商品].[単価]と書けば、避けられる場合があります。それでもエラーになるなら、別名を「単価_出力」などに変えてください。取り込み先が列名を決めている場合は、出力された見出しがその名前になっているか確認します。
このクエリを保存し、ナビゲーションウィンドウでクエリを選んでから、テキストファイルにエクスポートします。保存済みのエクスポート定義やVBAで出力している場合は、出力元をテーブル名からこのクエリ名に変更します。
文字列にすると変わること
エクスポートの「文字列の引用符」が「"」になっていると、数値を文字列にした列も "0.12345" のように引用符で囲まれて出力されます。取り込み先が、数値の列に付いた引用符を受け付けるか確認してください。区切り文字や引用符の設定全体は、エクスポートの手順とあわせて決めてください。
出力後の確認
- メモ帳で開き、小数点以下の桁数が想定どおりか。
- 小数点の記号が「.」になっているか。
- 指数表記(E-05など)が出ていないか。
- 空欄のレコードが、空欄のまま出力されているか。
- 引用符の有無が、取り込み先の仕様に合っているか。
- 出力件数が、テーブル(またはクエリ)の件数と一致するか。
- 別のパソコンで出力する運用なら、そのパソコンでも同じ結果になるか。
