タイトル : Re: EXCEL シートをレコードセットに取り込む 投稿日 : 2019/12/21(Sat) 22:07 投稿者 : 魔界の仮面弁士
Recordset として取り込む際のミドルウェアとして、 OLE DB の JET Provider ないしは ACE Provider さもなければ ODBC の Excel Driver あるいは、DAO の Excel I-ISAM 機能を 使っているものと推察します。 これらの機能を使って、Excel 表や HTML 表からデータを取り込む場合、 先頭n件のデータ内容(既定では 8 行目まで)によって、 そのフィールドのデータ型が自動判断される仕様です。 その結果、そのフィールドが数値型や日付型やブール型と判断された場合には、 それに合致しないデータが含まれていたセルに関しては、取り込み時に 値が Null(もしくはエラー)として扱われる仕様になっています。 これについては、接続時の文字列パラメーターに対して『;IMEX=1』を付与することで、 この問題を改善することができるでしょう。どのミドルウェアで接続しているかによって 設定場所が異なりますが、ひとまず下記が参考になるかと思います。 http://hanatyan.sakura.ne.jp/vbhlp/dao_002.htm http://www.hanatyan.sakura.ne.jp/logbbs/wforum.cgi?no=7083&reno=7080&oya=7027&mode=msgview ちなみにレジストリには、この型判定の行数等を設定するための項目が存在します。 Jet 3.0〜3.5 の場合、Jet 4.0 の場合、ACE の場合、そして 32bit/64bit ととで それぞれレジストリキーの場所が異なりますが、内容は基本的に同じです。下記を参照。 https://docs.microsoft.com/ja-jp/office/client-developer/access/desktop-database-reference/initializing-the-microsoft-excel-driver?WT.mc_id=DT-MVP-8907&tabs=office-2016 このレジストリ設定は HKEY_LOCAL_MACHINE 配下の設定を元に動作しますが、 自分のアプリだけを別設定としたい場合は、HKEY_CURRENT_USER の下に設定して、 そのレジストリパスをプログラムから渡すことでカスタム動作に変更できます。 …とはいえ、通常の案件でレジストリを操作する必要はほぼ無いでしょう。 まずは IMEX=1 の指定を試してみてください。 |