Access (VBA)

Access VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Home : Access 2016)
Excelファイルの項目を指定してインポートする方法
投稿日時: 20/11/04 15:17:50
投稿者: mbs

Excelファイルのインポートについて
 
データ移行のため、既存のデータベース(Excel, CSV)から吐き出したデータをAccessで加工し
新規データベース用のデータを作成しなければなりません。
 
CSVを取込処理の経験はあるのですが、Excelは経験ありません。
Excelには取込不要な項目も含まれており、レコード件数は多いので100万件ほどになります。
CSVの場合は、インポート定義を作成し必要な項目だけインポートできるのですが、Excelは可能なのでしょうか?
Excelで処理する場合、ローカルテーブルに必要な項目だけインポートするにはどの処理が適切でしょうか?
 
@ExcelファイルをCSVファイルに保存してから取り込む(インポート定義使用)
 
AAccessにExcelへのリンクテーブルを作成し、クエリを使用して対象項目のみローカルテーブルに取り込む
 
BExcelファイルを全項目インポートし、クエリを使用して対象項目のみローカルテーブルに取り込む
 
CAccessVBAで、DoCmd.TransferSpreadsheetの"Range"に対象項目の列を指定する
 
 
詳細設計が出来ていると聞いて始めたですが、具体的な処理方法の記載がない上、来週から製造に入らなければならず、時間的に余裕がありません。
他の人はAccessやVBAの知識がないため、出来るだけVBAのコーディング量は減らしたいと考えています。
 
経験者の方、ご教授いただけますでしょうか。
宜しくお願いします。

回答
投稿日時: 20/11/04 16:20:30
投稿者: sk

引用:
Excelには取込不要な項目も含まれており、レコード件数は多いので100万件ほどになります。
CSVの場合は、インポート定義を作成し必要な項目だけインポートできるのですが、
Excelは可能なのでしょうか?

Access におけるワークシート変換に際して、テキスト変換時のように
インポート定義を指定することは出来ません。
 
引用:
AAccessにExcelへのリンクテーブルを作成し、
クエリを使用して対象項目のみローカルテーブルに取り込む

この場合、取込対象となるフィールド(列)のみを選択することは可能ですが、
各フィールドのデータ型を明示的に指定することまでは出来ません
 
MS サポート より:
https://support.microsoft.com/ja-jp/office/excel-%E3%83%96%E3%83%83%E3%82%AF%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E3%82%A4%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%88%E3%81%A8%E3%83%AA%E3%83%B3%E3%82%AF%E3%81%AE%E8%A8%AD%E5%AE%9A-a1952878-7c58-47b1-893d-e084913cc958
 
引用:
Access は、ソースの最初の 8 行をスキャンして、
テーブルのフィールドのデータ型を決定します。
ソースの最初の 8 行のどの列にも、異なるデータ型が
混在しないようにすることをお勧めします。
混在すると、適切なデータ型が列に割り当てられなくなる
可能性があります。

例えば、ワークシートのある 1 つの列において、
最初の 8 件のデータ行の全てのセルの値のデータ型が数値である時、
Access はその列のデータ型を倍精度浮動小数点型として解釈します。
 
しかし、もし 9 件目以降のいずれかの行に、データ型がテキスト型である
セルが含まれていた場合、それらのセルの値についてはデータ型変換エラーによって
取り込むことが出来ない、といったことが起こり得ます。
 
つまり、インポート対象となる各列(特に数値や日付、255文字を超える
長さの文字列を扱うもの)において、全ての行のセルの値のデータ型が
統一されていることが保証されていなければなりません。
 
何らかのプログラムによってシステマティックに加工、出力された
ワークシートであるならともかく、もしそのワークシートが
エンドユーザーの手によって作成、または編集されたものである場合、
上記のような問題が発生する可能性があることについて懸念された方がよいでしょう。
 
引用:
BExcelファイルを全項目インポートし、クエリを使用して
対象項目のみローカルテーブルに取り込む

上記の方法を用いる場合も同様です。
 
引用:
CAccessVBAで、DoCmd.TransferSpreadsheetの"Range"に対象項目の列を指定する

また、TransferSpreadsheet メソッドを使用してワークシートのインポートを
実行する際、インポート範囲の一部の行や列をスキップさせることは出来ません。
 
引用:
@ExcelファイルをCSVファイルに保存してから取り込む(インポート定義使用)

したがって、挙げられた候補の中では
これが一番安全ではないかと思います。
 
引用:
データ移行のため、既存のデータベース(Excel, CSV)から吐き出したデータを
Accessで加工し新規データベース用のデータを作成しなければなりません。

ただ、そのインポート作業が一過性のものに過ぎず、
日常処理として定期的にレコードを取り込むわけではないなら、
無理して VBA を使うこともないのではないでしょうか。
(インポート対象となるワークシートの数がどれだけあるか次第でしょうけど)

投稿日時: 20/11/04 16:35:09
投稿者: mbs

sk様
 
ご回答ありがとうございます。
 
詳細に説明がありましたので、よく理解できました。
@の方法が一番、コードも少なくてすみそうなので良かったです。
 
本当にありがとうございました。