● 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エンジン系の方法と、JET系の方法の比較メモ

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」が設定される場合などについて「そうかぁ~、だから、かあ~!」と納得できました。

こちらのサイトはその他の有用な情報もいっぱいあります。
どうぞ、ご覧になってみてください。

★ Cnの接続文字の、ISAM形式について

前項の、「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 が開けちゃいますけど、そのへんはよくは分かりません・・・。

このレジストリ設定には、そのほかにもいろんな設定値が見つかりますので、何かの役に立つかもしれません。

  
  

  
  
★ 参考Web記事

ADOでExcelデータを読みに行く件について
以下のURLも参考にしてください。

https://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4GGHP_jaJP680JP697&q=Extended+Properties+Excel&gws_rd=ssl

https://social.msdn.microsoft.com/Forums/vstudio/ja-JP/9bb9ab2b-5d9d-4c45-9117-7bf17ea970c2/12487125401247912505125401247312456125311247212531ace12392jet1239?forum=vbgeneralja

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

https://social.msdn.microsoft.com/Forums/ja-JP/40f4794c-23f3-4d7f-a8f5-9b0558c0e9f6/excel2010-x6465289ado-234553489226178124561252112540-82172147467259?forum=vbajp

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