Excel ADO

最初は何が原因だか全くわからなかったのだけど、Excelのワークシートに対してADOを使ってinsertしたりすると、ファイルが破壊されてしまう(ファイルを開いたときに『ファイルエラー:データが失われた可能性があります』とメッセージがでて、insertしたつもりなのとは違う場所にデータが入ったり、データが消えたりする。)という問題に悩んでいたのでした。

原因だったのはたぶんこれ↓。行の中の一部の列が空白であるようなシート(=テーブル)にinsertすると変な場所にデータが挿入される。Jet4.0、ADO2.1、2.5、2.6で発生し、Jetの最新のサービスパックをあてると解決されるようなことが書いてある。本当かな??Jetは最新にしているつもりだったのだけれど。

こちらが英語の原文
こちらは機械訳。かなりめちゃくちゃ。

それ以外にも、今回役に立った記事をいくつか貼り付けておこう。

こちらはExcelにADOを使って接続するサンプル。もちろんVB6のプログラムです。ADOは2.5/2.6あたり、Excelは2000を想定しているようです。ADO2.7でも動きそうな気がしますが未確認。Excelについては、XP(2002)、2003とも大丈夫でした。
これはExcelにデータを転送するいろいろな方法を紹介した記事。『オートメーションを使用して ADO レコードセットをワークシートの範囲に転送する』という項目が参考になった。

'Transfer the data to Excel
oSheet.Range("A1").CopyFromRecordset rs

というような感じでレコードセットをいきなり貼り付けることができるのです。便利。

Office Space: Using ADO to Query an Excel Spreadsheet | Microsoft Docs
VBでADOを使ってExcelに接続するときの基本的な手順がまとめられている。ちょっと文章の階層構造がわかりにくいけれど内容豊富。VBIDEで初回起動時にでる『選択された CollatingSequence は OS でサポートされていません。』というエラーの話とか、Excelのワークシートをデータベースとして利用する上での制限事項とかが書いてある。
こちらはADOXの話。テーブルの作成・削除とか。あとデータ型の話もある。

『標準の Excel の列にデータを追加する』の項目で

ADOX を使用せずに作成または変更された Excel ワークシートまたは範囲に ADO を使用してデータの挿入または変更を行う場合、挿入するデータの型に制限はありません。

  • 数値は左詰めで表示されます。Excel 2002 では、数値は "テキスト形式の数値" を警告するスマートタグが付けられます。特に、数値を解析する目的で Excel にデータを格納している場合、後でデータを使用して作業するときに、このことが原因で問題が発生することがあります。

と書いてあるけど、1行だけダミーのデータを手で入力しておいたら、あとからADOで挿入した行もダミーと同じ表示形式になってくれて、数値に'が付かなくなった。これについては上のExcelADOのSAMPLEの中にあるコメントも参照するべし。非表示にされたダミーデータを使ってデータ型を認識させているらしい記述がある。

それから、『ADO』というのと『MDAC』というものの関係がよくわかっていない。バージョンすらよくわからない。バージョンの調べ方が書いてあるサイトとかにリンクをはっておこう。

@IT:Windows TIPS -- Tips:MDACのバージョン調査ツールを利用する

http://homepage1.nifty.com/MADIA/vb/vb_bbs/200402_04020082.html
VB界の神、魔界の仮面弁士さんがADOやMDACのバージョンについてちょっと解説されている。