なずブログ

インフラSE、Java開発、リモートワークエンジニアな人のメモ帳

VBAでADOというテキストファイルの読み込み方法について

f:id:nazuna_0124:20170312082946p:plain

VBAでテキストファイルを読み込むときです。

普通はFSOかLineなんちゃらを使います。


データ抽出にSQL文を使いたくなったらADO接続の出番です。

SQL知ってれば)抽出や並び替えを簡単に行えます。


また、意外な盲点でしたがデータ内部に

改行コードが含まれてるときにも便利です。


以下のようなデータを想定

[LF]が改行コードだと思って下さい。


“ID”,“名前”,“本文”[LF]

“001”,“なずな”,“こんにちわ。[LF]今日は雨です。”[LF]

“002”,“なずな2”,“こんにちわ2。[LF]今日は雨です2。”[LF]


行の終わりだけではなく、データの中にも

入ってしまっているということですな。



コードはこちら

Sub AdoTxt()
    Dim Con As New ADODB.Connection
    Dim Rs As New ADODB.Recordset
    Dim path As String
    Dim sql
    
    
    path = ThisWorkbook.path & "\"
    Filename = "test.txt"
    
    
    Con = "Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=" _
      & path & ";" _
      & "ReadOnly=0;"
      
    Con.Open
    
    sql = "SELECT * FROM " & Filename
    
    '絞込
    'sql = "select * from " & Filename & " where id = '001'"
 
    Rs.Open sql, Con, adOpenKeyset, adLockPessimistic
    
    Debug.Print Rs.RecordCount
    
    Do Until Rs.EOF
        Debug.Print Rs.Fields(0); Rs.Fields("名前"); Rs.Fields(2)
        Rs.MoveNext
    Loop


End Sub



注意点として以下。


  • Microsoft ActivS Data Object … を参照設定してね

  • 追加はReadOnly=1にすれば可能。更新、削除は不可。

  • 速度自体はあんまり早くない。

  • Rs.Open のとこのおまじないはレコード数の取得に必要

  • エディタで対象テキストを開いているとロックでエラーになる。



こんなかんじです。

Rsのレコードセット取得できれば、イメージとしては

テキストストリームです。



おおむね同じ方法でAccessファイルへも接続できます。

こっちは更新、削除も当然可能です。


同時処理もわりとできるのでExcelの共有ブックに困ったときの

回避手段のひとつです。

これはまたこんど!