【AccessVBA/ExcelVBA】テキストファイルの出力~Open/Printステートメント

VBAでテキストファイルにデータを出力する方法のひとつである、Openステートメント、Printステートメントの使い方を紹介します。

まずはVBAからテキストファイルを開くためのOpenステートメントについて、構文を見ていきましょう。

Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength]

accesslockreclengthと書かれている引数は使用頻度が低いため説明は割愛し、青字の引数について説明します。

pathname出力先のファイル名です。
modeファイルを開く際のモードを指定するためのキーワードを設定します。選べるキーワードは、
・Append(追記)
・Output(上書き)
・Input(読み込み)
・Random(ランダムアクセス)
・Binary(バイナリアクセス)
の5種類。Input以外はpathnameで指定したファイルが存在しない場合はファイルを作成します。今回はOutputを使って書き出していきます。
[#]filenumberファイルを操作するための番号を指定し、開いている間の操作はこの番号に対して行います。指定可能な番号はFreeFile関数で取得できます。

それではOpenステートメントで開いたテキストファイルにテーブルの中身を出力するためのサンプルコードを見ていきましょう。

テキストファイルへの出力(サンプルコード)

出力するテーブルと出力形式は【AccessVBA】テキストファイルの出力~TransferTextと同様(テーブル1の内容を1行目は項目名、文字列項目をダブルクォーテーションで囲いタブ区切りで出力)でいきます。

Private Sub エクスポート_Click()
    Dim strFile As String
    Dim intFree As Integer
    Dim objRS As Recordset
    Dim strA() As String
    Dim intLoop As Integer
'出力先のファイル名を変数に格納
    strFile = "C:\Users\hogehoge\Desktop\テーブル1.txt"
'使用可能なファイル番号を取得
    intFree = FreeFile
'テキストファイルをOutputモードで開く
    Open strFile For Output As #intFree
'出力したいテーブルをレコードセットで開く
    Set objRS = CurrentDb.OpenRecordset("テーブル1", _
                                        dbOpenForwardOnly, _
                                        dbReadOnly)
'1行目に出力する項目名を配列に格納
    ReDim strA(objRS.Fields.Count - 1)
    For intLoop = 0 To objRS.Fields.Count - 1
        strA(intLoop) = objRS.Fields(intLoop).Name
    Next intLoop
'1行目を出力
    Print #intFree, Join(strA, vbTab)
'2行目以降を出力
    Do Until objRS.EOF
        For intLoop = 0 To objRS.Fields.Count - 1
            Select Case objRS.Fields(intLoop).Type
            Case dbChar, dbMemo, dbText
                '文字列型項目の場合はダブルクォーテーションで囲う
                strA(intLoop) = """" & Nz(objRS.Fields(intLoop), "") & """"
            Case Else
                strA(intLoop) = Nz(objRS.Fields(intLoop), "")
            End Select
        Next intLoop
        Print #intFree, Join(strA, vbTab)
        objRS.MoveNext
    Loop
    objRS.Close
    Close #intFree
    MsgBox "出力完了", vbOKOnly + vbInformation, "サンプルコード"
End Sub

動かしてみると、無事前回と同じ結果が得られました。

今回の使い方では、TransferTextと大差ない結果であり、プログラムの量を考えると「大変なだけであまり意味がない」と思えるかもしれません。しかし、出力するファイルの形式はさまざまなものが要求されます。

特殊なヘッダ行を追加したいとか、ファイルの最後にレコード件数と定型の文字を入れたい、とか、細かな要求に応えるためには、今回のようなプログラムによるファイル操作が必要になってきます。覚えてしまえばそれほど難しいものではありませんので、しっかり使いこなしていきましょう。