いつものようにExcelからADOでAccessに接続するコードを書いてた時のことです。
接続先のDBにテキストファイルをインポートさせたい部分がありました。
んー・・・Accessのライブラリを参照設定してTransferTextでやるかなー、と思ったのですが。
DoCmdを使うならAccessを起動させなければなりません。
ちょっとやだなー、と。重いし。
んー・・・Accessのライブラリを参照設定してTransferTextでやるかなー、と思ったのですが。
DoCmdを使うならAccessを起動させなければなりません。
ちょっとやだなー、と。重いし。
せっかくADOで接続してるんだから、それでどうにかならんのかしら?と調べました。
そしたらSQLで「SELECT ... INTO」というのがあることがわかりました。
そしたらSQLで「SELECT ... INTO」というのがあることがわかりました。
テキストファイルを一つのテーブルと見立てれば、上の方法で外部DBからのインポートとして処理できました。
テキストファイルをテーブルと見立てるには、そのファイルがあるディレクトリをDBとして設定します。
テキストファイルをテーブルと見立てるには、そのファイルがあるディレクトリをDBとして設定します。
たとえばD:\My Documents\TESTというフォルダに「受注明細.TXT」というファイルがあるとします。
これを、以下のようなコードによりADOで開くことができます。
メッセージボックスに1行目を表示します:
HDRはヘッダーのこと。YESなら1行目をフィールド名と見なす、NOなら見なさないという。
で、「受注明細.TXT」という目的のファイル名を[受注明細#TXT]と表記します。
ドットを#にしておくのがお約束らしい。
メッセージボックスに1行目を表示します:
Public Sub Open_TextFile() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\My Documents\TEST;" & _ "Extended Properties='TEXT;HDR=NO'" Set rs = New ADODB.Recordset rs.Open "SELECT * FROM [受注明細#TXT]", cn MsgBox rs.Fields(0) & vbTab & rs.Fields(1) & vbTab & rs.Fields(2) & _ vbTab & rs.Fields(3) & vbTab & rs.Fields(4) rs.Close Set rs = Nothing cn.Close Set cn = Nothing End Sub「Extended Properties」っていうのがミソで、これでテキストファイルだよんと指定します。
HDRはヘッダーのこと。YESなら1行目をフィールド名と見なす、NOなら見なさないという。
で、「受注明細.TXT」という目的のファイル名を[受注明細#TXT]と表記します。
ドットを#にしておくのがお約束らしい。
上のコードを実行した結果です:
ちゃんと1行目のレコードが参照されている模様。
これを踏まえて、インポートするコードです(実験用にAccessの中で書いたもの):
Public Sub Import_TextFile() Dim cn As ADODB.Connection Dim sSQL As String Set cn = CurrentProject.Connection sSQL = "SELECT * INTO 受注明細 FROM [受注明細#TXT] IN " & _ "'D:\My Documents\TEST' 'Text;HDR=NO'" cn.Execute sSQL cn.Close Set cn = Nothing End Sub実行結果:
おお。
ヘッダーをNOにするとフィールド名がF1,F2,F3・・・になるのは仕様のようです。
ヘッダーをNOにするとフィールド名がF1,F2,F3・・・になるのは仕様のようです。
ちなみにこのコードはAccess2007・Access2002で動作を確認しました。