エクセルのブックをアクセスに取り込む
まあ、そんなわけで最近は access で vba とかさわってるんですが、JScript や C# とかで書けるようにはならんもんですかね。最初から dbms として access を見て C# で全部かけって?
というわけで、エクセルのブックに1シート1テーブル形式で保持されている内容をアクセスに取り込むような作業をやってみた。
- TransferSpreadsheetかOLE Automation
- TransferSpreadsheetならExcelいらずだし色々自動化してくれる
- シートの一覧ってどうやって取るの?
- 無理ぽ、Excel をオートメーションで使うとか、Excel のファイルを扱えるライブラリを使う
- フィールド名
- フィールドの名前はシートの1行目で指定して、引数 HasFieldNames を True にする
- フィールドの型
- 各列の最初のデータから自動判定。HasFieldNames が True なら2行目の内容次第ってこと
- シートを指定したいんだけど
- 引数 Range に範囲指定
- 具体的には?
- Sheet1全体から取り込むなら "Sheet1!" と最後に ! をつける。web 上ではシート名だけでいいとか、OLE Automation で目的のシートを Select で選択しておかないとダメとかあるけど*1、 ! をつけてシート全体を指定するだけですべて OK。
- "Sheet1!" でインポートしたら "Sheet1$" が見つからないってエラーでるんだけど?
- 指定したシートが存在しないと、勝手に $ に変換されるみたい。つまり、シート名のスペルミス。実はシート名が "Sheet1 " だったとか、よくあること
- TransferSpreadsheetで作ったテーブルが存在しないってエラーになる
- TransferSpreadsheet の実行後、TableDef.Refresh しないと VBA からは発見できないよ(より上位の階層をRefreshしてもよい)
- TransferSpreadsheetで追加インポートしたデータがフォームで表示されないよ
- Requery
情報に困ったら英語のQnAを読め。帳票関連だけは日本の帳票文化依存の部分があるので日本語の情報もみたほうがいい、ってかんじですね。
*1:シート名が間違ってると選択されているシートが対象になるので、そのあたりから来た誤情報かな