● ADO:Excel2010で、開かれていない閉じたままのブック・Excel(xls)データをできるだけ速く読み込む方法ーその2(ADOにて)
目次
★ サンプルファイルのダウンロードとプログラムコード
★ ACEエンジン系の方法と、JET系の方法の比較メモ
★ レコードセットの範囲設定の方法各種
★ Cnの接続文字の、ISAM形式について
★ 参考Web記事
※Shift+TABキー、もしくは、Homeキー、Homeキー+TAB数回、を押すと、目次付近に戻れます。
※関連記事
『Excel2010で、開かれていない閉じたままのブック・Excel(xls)データをできるだけ速く読み込む方法(DAOにて)』
『~SQLにて「閉じたExcelファイルを ”閉じたまま” 書き込む方法01」~Microsoft Queryを利用する場合~』
『Excel2010で、『 開かれていない閉じたままのブック・Excel(xlsやxlsx・xlsm)ファイルのデータ 』を読み込むだけでなく、書き込む方法の一覧表(DAOやADOにて)』
『ADO:Excel2010で、開かれていない閉じたままのブック・Excel(xls)データをできるだけ速く読み込む方法ーその2(ADOにて)』
『Access2000VBA・Excel2000VBA独学~別の閉じたExcelファイルを ”閉じたまま” 読み込みや書き込をする方法~5つ』
サンプルファイルのダウンロード
https://euc-access-excel-db.com/00000WPZIP/tes1_ADO.zip
※ウィルスチェックはVirustotalで行いました。
サンプルファイルの名前は、「tes1_ADO.xlsm」です。
解凍してから「Dドライブにtest01というサブフォルダをつくりその中」とデスクトップの2か所にコピペして、デスクトップ側の「tes1_ADO.xlsm」から試してみてください。
Sheet2が選択されて開いているとおもいますので、そのままの状態で、「開発」タブから「Visual Basic」のボタンを押して、VBE(Visual Basic Editor)を開きます。
その後、「Module1」の「ReadByADO01」を実行します。(プログラム内のどこかをいったんクリックしてから、F5キーを押すと実行できます。)
2010以降でファイルを開いた場合は、「コンテンツの有効化」を押してからお試しください。
このサンプルは別ファイルの「d:\test01\tes1_ADO.xlsm」の、「静的な表-意外とわかりにくい」というシート(複数のクロス集計表があるシート)の内容の一部を、Sheet2に吸い込み・転記するものです。(「静的な表-意外とわかりにくい」というシートはADOにて「システムテーブル」として扱っています。あと、Sheet2はだいぶ後ろのほうのシートです。)
VBEの「ツール→参照設定」にて、「Microsoft ActiveX Data Objects 2.8 Liblary」にチェックが入ってないとエラーになりますのでそこを事前に確認してください。
※「SrcXLFName = "d:\test01\tes1_ADO.xlsm" 」の行で、右辺の「"d:\test01\tes1_ADO.xlsm"」を、「UNCパス」で記述して、ファイルサーバの共有フォルダに在るExcelファイルを指定することもできます。つまり、LAN経由での読み込みもできます。
その際は右辺を「"\\ファイルサーバー名\共有フォルダ名\tes1_ADO.xlsm"」みたいな感じに書き換えます。
(ここでは、「\」は、半角の「¥」を意味しています。)
では、以下、サンプルプログラムです。
ACEエンジン=Excel2007~2016の場合
'------------------------------------------------------------------------------------------------
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=" & strFileName & ";" & _
"Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1;Readonly=False"""
'------------------------------------------------------------------------------------------------
xlsmはもちろん読めますし、かつ、xlsも読めます。
(xlsでも「12」のままで読めるみたいです。12とかは)
こちらの形式で読みに行くと、
1枚シートに複数のクロス集計表がある場合、
DAOと同じようにすべてのセルの値を、
1列の中にあるセルのデータの表示形式(データ型)が違っていても、
読み込めるみたいです。
8行目までのセルの値でデータ型が決まるらしいです。
JETのほうの接続文字だと、
8行目以前と以降のデータ型が違うと、
8行目以降が空白で読み込まれてしまいます。
(ちゃんと読み込む方法があるのかも?)
もしDAOではなく、「ADOでやる場合は」、
8行目以前と以降でデータの表示形式(データ型)が
違う場合は、「JET形式でちゃんと両方とも読みこめるやり方」が
見つかるまでは、xlsm、xlsx、xls、すべて、
ACEエンジンの構文で読みにいくほうが良いっぽいです。
(JET形式にもともとそういう方法が無いかもしえないけど)
===================
JETエンジン=Excel2000~2003の場合
'------------------------------------------------------------------------------------------------
'cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & strFileName & ";" & _
"Extended Properties=""Excel 8.0;HDR=Yes;"";"
'------------------------------------------------------------------------------------------------
こちらの形式では、xlsmやxlsxはもともと読めません。
xlsはもちろん読めるけど、でも、
8行目以前と以降のデータの表示形式(データ型)が違うと、
8行目以降(あるいは最初に認識されたデータ型以外のデータ型)は
空白で読み込まれてしまいます。
(特に、1シートに、複数のクロス集計表があって、「列名」のセルの位置がぐっちゃぐちゃで、正しく「シートの行番号1の行」に無い場合。)
なので、動的な表以外はJETエンジンの構文で読み込まないほうがいいかもです。
(ちゃんと読み込める方法が見つかるまでは。見つからないかもだけど)
'注:成功したコード!!! 後日判明!!!!
'「Extended Properties」に「;IMEX=1」を追記すると、
'JET形式でのアクセスでも、セルに入力された値に関わらず、全値を読み込めました。
'読めたのは今のところ「xls」拡張子のファイルだけですが・・・。
'僕の環境だけだといけないので、皆さんもご自分の環境でお試しください。
'こちらの環境としてはWindows10+Excel2010です。
'その環境にて、xlsファイルを読みにいった場合のテスト結果です。
Cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & SrcXLFName & ";" & _
"Extended Properties=""Excel 8.0;HDR=YES;IMEX=1"""
※「IMEX=1」などの値については、『Excel2010で、開かれていない閉じたままのブック・Excel(xls)データをできるだけ速く読み込む方法(DAOにて)』の「(02)読み込み時の列名について」の後半部分(この項の図のすぐあと)をお読みになってみてください。(あるいは(03)のすぐ上。)
あるいは、こちら→『DAOでExcelデータを読み込みテキストボックスに表示』
★ レコードセットの範囲設定の方法各種
こちらの→「ADO.NETでExcelファイルに接続する」のサイトに、詳しいCnの接続文字の説明があります。
ここから少し引用させていただきます。
=========引用ここから========
【接続文字について】
?Provider: Microsoft.ACE.OLEDB.12.0
?Data Source: ファイル名
?Extended Properties: ISAM形式; オプション
ISAM形式は Excel 12.0、Excel 12.0 Xml、Excel 12.0 Macro、Excel 8.0 など。 HKLM\SOFTWARE\Wow6432Node\Microsoft\Office\14.0\Access\Access Connectivity Engine\ISAM Formats (もしくはそれに準ずる場所)で一覧が見れます。オプションは・・・
? HDR=NO:ヘッダ行なし(F1, F2, ...といった列名になる)
? MAXSCANROWS=[1..16]:データ型の自動判定に使われる行数
【レコードセットのデータ範囲について】
?[名前](Excelで定義した領域名)
?[シート名$](データが入力されている左上から右下までの範囲)
?[シート名$名前]
?[シート名$セル範囲]([シート名$] の範囲内のみ)
をテーブル名として、SELECT/INSERT/UPDATEが普通に使えます。ただしDELETEはできない。
=========引用ここまで========
上記の部分がとても勉強になりました!!
[シート名$名前]・・・ここでの「名前」は名前の定義での名前なのかな???
[シート名$](データが入力されている左上から右下までの範囲)・・・マジ、勉強になります!!
取得できるデータの範囲というか、自動的に「F1」が設定される場合などについて「そうかぁ~、だから、かあ~!」と納得できました。
こちらのサイトはその他の有用な情報もいっぱいあります。
どうぞ、ご覧になってみてください。
前項の、「ADO.NETでExcelファイルに接続する」のサイトに、接続文字の、ISAM形式について、レジストリの以下の項目を見てくださいと書いてありました。
HKLM\SOFTWARE\Wow6432Node\Microsoft\Office\14.0\Access\Access Connectivity Engine\ISAM Formats
僕の環境ではこのキーは存在せず、以下のキーでした。(たぶん・・・)
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Office\14.0\Access Connectivity Engine\ISAM Formats]
これはWindows10の64bitに、Office2010パーソナル・32bitをインストールした環境下でのキーです。
このキーの内容を「.reg」拡張子のファイルにエクスポートします。
それをテキストファイルに変えて(拡張子をregからtxtに書き換えて)読んでみますと・・・以降のような記述が見つかります。
========
省略したキーの内容→→→HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Office\14.0\Access Connectivity Engine\ISAM Formats
その他にもいっぱい設定値を省略しています。
[・・・キー内容省略・・・\ISAM Formats\dBASE 5.0]
"Engine"="Xbase"
"ExportFilter"="dBASE 5 (*.dbf)"
"ImportFilter"="dBASE 5 (*.dbf)"
[・・・キー内容省略・・・\ISAM Formats\dBASE III]
"Engine"="Xbase"
"ExportFilter"="dBASE III (*.dbf)"
"ImportFilter"="dBASE III (*.dbf)"
[・・・キー内容省略・・・\ISAM Formats\dBASE IV]
"Engine"="Xbase"
"ExportFilter"="dBASE IV (*.dbf)"
"ImportFilter"="dBASE IV (*.dbf)"
[・・・キー内容省略・・・\ISAM Formats\Excel 12.0]
"OutputFormat"="Excel Binary Workbook (*.xlsb)"
"ExportFilter"="Excel バイナリ ブック (*.xlsb)"
"ImportFilter"="Excel バイナリ ブック (*.xlsb)"
"Engine"="Excel"
[・・・キー内容省略・・・\ISAM Formats\Excel 12.0 Macro]
"OutputFormat"="Excel Macro-Enabled Workbook (*.xlsm)"
"ImportFilter"="Excel マクロ有効ブック (*.xlsm)"
"Engine"="Excel"
[・・・キー内容省略・・・\ISAM Formats\Excel 12.0 Xml]
"OutputFormat"="Excel Workbook (*.xlsx)"
"CanLink"=hex:01
"ExportFilter"="Excel ブック (*.xlsx)"
"ImportFilter"="Excel ブック (*.xlsx)"
"Engine"="Excel"
[・・・キー内容省略・・・\ISAM Formats\Excel 5.0]
"Engine"="Excel"
"ExportFilter"="Microsoft Excel 5.0/95 ブック (*.xls)"
"ImportFilter"="Microsoft Excel (*.xls)"
"OutputFormat"="Microsoft Excel 5.0/95 Workbook (*.xls)"
"ReportFormat"="Microsoft Excel 5.0/95 Workbook"
[・・・キー内容省略・・・\ISAM Formats\Excel 8.0]
"Engine"="Excel"
"ExportFilter"="Excel 97-2003 ブック (*.xls)"
"OutputFormat"="Excel 97 - Excel 2003 Workbook (*.xls)"
"ReportFormat"="Excel 97 - Excel 2003 Workbook"
[・・・キー内容省略・・・\ISAM Formats\Exchange 4.0]
"Engine"="Exchange"
"ImportFilter"="Exchange()"
[・・・キー内容省略・・・\ISAM Formats\HTML Export]
"Engine"="Text"
"ExportFilter"="HTML ドキュメント (*.html;*.htm)"
[・・・キー内容省略・・・\ISAM Formats\HTML Import]
"Engine"="Text"
"ImportFilter"="HTML ドキュメント (*.html;*.htm)"
[・・・キー内容省略・・・\ISAM Formats\Jet 3.x]
"Engine"="Jet 3.x"
[・・・キー内容省略・・・\ISAM Formats\Outlook 9.0]
"Engine"="Exchange"
[・・・キー内容省略・・・\ISAM Formats\Text]
"Engine"="Text"
"ExportFilter"="テキスト ファイル (*.txt;*.csv;*.tab;*.asc)"
"ImportFilter"="テキスト ファイル (*.txt;*.csv;*.tab;*.asc)"
"OutputFormat"="MS-DOS Text (*.txt)"
"ReportFormat"="MS-DOS Text"
"FormatFunction"="txt,SOA_RptToAscii,1,MS-DOS Text (*.txt)"
==============
これを見ると、
(*.xlsb)バイナリブック →「Excel 12.0」
(*.xlsm)マクロ有効ブック →「Excel 12.0 Macro」
(*.xlsx)Excel ブック →「Excel 12.0 Xml」
(*.xls)Excel 5.0/95 ブック →「Excel 5.0」
(*.xls)Excel 97-2003 ブック →「Excel 8.0」
(*.txt;*.csv;*.tab;*.asc) →「Text」
って書けばいい感じなのかな~???なんてイメージが浮かびます。
実際には、「Excel 12.0」でも、*.xlsm が開けちゃいますけど、そのへんはよくは分かりません・・・。
このレジストリ設定には、そのほかにもいろんな設定値が見つかりますので、何かの役に立つかもしれません。
ADOでExcelデータを読みに行く件について
以下のURLも参考にしてください。
https://antonsan.net/vt/excel-db/heading-3/page-019
https://ameblo.jp/realsystems/entry-11946216560.html
https://excelwork.info/excel/excelado/
http://blog.sorceryforce.net/?p=154
https://qiita.com/unarist/items/6cc35bb9fe502ced332f
http://www.accessclub.jp/ado/12.html
https://oshiete.goo.ne.jp/qa/8109288.html
http://hanatyan.sakura.ne.jp/vbhlp/dao_002.htm
Accessの64bitのDAOについて
http://note.phyllo.net/?eid=1106279
Excel 64bit DAO
https://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4GGHP_jaJP680JP697&q=Excel+64bit+DAO&gws_rd=ssl
Excel2010、DAO3.6が参照不可になる原因
http://excelshogikan.com/tips/tips093.html
Jet / ACE エンジン
http://dxr165.blog.fc2.com/blog-entry-117.html