AccessにExcelからデータをインポートすることはよくありますよね。
空の新しいテーブルにインポートするときもありますし、「次のテーブルに追加する」で既存のテーブルに追加するときもあります。
いずれにせよ、インポート元のEXCELファイルによっては「いくつかのデータが正常にインポートされませんでした」というエラーが表示されることがあります。
AccessへExcelからインポートでエラーになるケース
今回表示されたエラーは以下の通りです。
ファイル●●をテーブル●●にインポートしました。いくつかのデータが正常にインポートされませんでした。正常にインポートできなかったレコードの行番号とエラー情報は●●インポートエラーテーブルに書き込まれました。
今回は既存のテーブルにインポートする方法をとっていましたので、普通に考えれば存在するテーブルのフィールド型に合わせてインポートし、型が合わない場合にエラーになるものです。
ですが、そのようにシンプルになっていないところがちょっとAccessに癖があるところです。
インポート元のEXCELデータ
ちょっと気になる点としては10行目の受講番号999999999が特殊だという点です。
左隅に緑の▲が表示されています。ここにカーソルを当てると「数字が文字列として保存されています」という警告が表示されます。
インポート先のテーブル(フィールド定義)
受講番号も名前もテキスト型(255)です。
データの行数によってエラーが発生
インポート元のデータは実は100行以上あり、最後の行が9999999でした。
これを行を減らしていくとエラーになったり、正常に取り込んだり…。
先の画像ではデータは9行(+ヘッダー行1行)で、これはインポートエラーです。
この元データの1行目を削除するとエラーにはなりません。
元々アクセスは取り込む元データの先頭~既定行を見て列の型を推測する動きをします。
テキストデータソースドライバー(MaxScanRows)
列のデータ型を推測する場合にスキャンする行の数です。0 に設定した場合はファイル全体が検索されます。既定値は 25 です。値の型は REG_DWORD 型です。出典:Microsoft
上記はテキストデータに関する規定値なので、元データがEXCELの場合はこの限りではなさそうです。
※通常この値を変更している人はいないでしょうね(;^_^A
今回は、データの上から8行で列のデータ型を推測していたようで、8行以内に明示的な文字列があれば「文字」として判断し、エラーにはならなかったという訳です。
必ず8行かと言われると他の要因もあると思いますので確約はできかねます。
ちなみに現在調査したAccessのバージョンは2007です。
また、実際のデータはもう少し列が多いです。
AccessへExcelからインポートのエラー回避方法は?
既存のテーブルへのインポートなので、テーブルの型を判断してくれればいいのに…。と思いつつもAccessの仕様なので、仕方がないですね。
となると回避方法は以下の2通りです。
- 元となるExcelファイルの先頭行(ヘッダー下のデータ行1行目)に強制的に型を判断してもらいたい値をセットする。
- 元となるファイルを一旦CSVにしてインポート定義を利用する
①の場合はダミー行として1行目にフィールドの型が明確に文字列になるよう、「A」などの文字を入れる方法です。
インポート後にダミーデータを削除するという手間は発生します。
②の場合は、一旦EXCELファイルをCSVファイルに変換することでテキストファイルインポート(TransferText)を使い、インポート定義を活用する方法です。
Excelのインポートではインポート定義を利用できませんが、テキストファイルのインポートでしたらインポート定義でインポート前に型を宣言することができます。
ちなみに、EXCELの書式を文字列にしたから文字列型という訳ではありません。EXCELの書式はあくまでも表示上の体裁を整えるものです。
まとめ
データの行数に依存して異なる挙動になるなど、予期せぬことが起こることが多いのもAccessの特徴の1つですよね。
これも1つの仕様ですので上手に付きあっていきましょう!