2009年08月

いつものようにExcelからADOでAccessに接続するコードを書いてた時のことです。

接続先のDBにテキストファイルをインポートさせたい部分がありました。
んー・・・Accessのライブラリを参照設定してTransferTextでやるかなー、と思ったのですが。
DoCmdを使うならAccessを起動させなければなりません。
ちょっとやだなー、と。重いし。

せっかくADOで接続してるんだから、それでどうにかならんのかしら?と調べました。
そしたらSQLで「SELECT ... INTO」というのがあることがわかりました。


テキストファイルを一つのテーブルと見立てれば、上の方法で外部DBからのインポートとして処理できました。
テキストファイルをテーブルと見立てるには、そのファイルがあるディレクトリをDBとして設定します。

たとえばD:\My Documents\TESTというフォルダに「受注明細.TXT」というファイルがあるとします。

イメージ 1

これを、以下のようなコードによりADOで開くことができます。
メッセージボックスに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]と表記します。
ドットを#にしておくのがお約束らしい。

上のコードを実行した結果です:

イメージ 2

ちゃんと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
実行結果:

イメージ 3

おお。
ヘッダーをNOにするとフィールド名がF1,F2,F3・・・になるのは仕様のようです。

ちなみにこのコードはAccess2007・Access2002で動作を確認しました。

ニコニコ版のIE8を使っていますが、タイトルバーに「の提供元」どーたらとか表示されています。

イメージ 1

今さらながら、ちょっとかっこ悪いので直しました。レジストリで変更できました。
(レジストリをいじるのは危険ですので、くれぐれもご注意を)

HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MainというところにWindow Titleというのが:

イメージ 2

イメージ 3

これを編集します:

イメージ 4

イメージ 5

IEを再起動すれば反映されます。

イメージ 6

なお上の「文字列の編集」で文字を全部消してOKにすれば、IEの名前自体を表示しないようにもできますが:

イメージ 7

サイト名のうしろにハイフンがつくのが仕様のようで、あまりかっこよくはありません。

ちなみに、これExcelの場合はどうかと言うと(図は2007です):

イメージ 8

VBAでApplication.Captionというプロパティに文字列を設定すれば、一時的には変更できます。
Application.Caption="どうしてこうなった"
イメージ 9

再起動すれば元に戻りますけど。

もしかして、これもレジストリで変更できんのかなーとついでに探してみました。
HKEY_CURRENT_USER\Software\Microsoft\Office\12.0\ExcelというところにExcelNameというそれっぽいのが。
値は「Microsoft Excel」となっています。
試しにこれも変更してみました。※危険な行為なので真似しないでください。

Excelを再起動したところ、一瞬だけ反映されました。
が、起動が終わり新規ブックが開くタイミングで元の「Microsoft Excel」という表示に戻ってしまいました。
変更したレジストリの値も自動的に元の「Microsoft Excel」に。
勝手に変えんなってことなのかな・・・まあ変える必要もないですがw

↑このページのトップヘ