VBAでテキストファイルにデータを出力する方法のひとつである、Openステートメント、Printステートメントの使い方を紹介します。
まずはVBAからテキストファイルを開くためのOpenステートメントについて、構文を見ていきましょう。
Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength]
accessやlock、reclengthと書かれている引数は使用頻度が低いため説明は割愛し、青字の引数について説明します。
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と大差ない結果であり、プログラムの量を考えると「大変なだけであまり意味がない」と思えるかもしれません。しかし、出力するファイルの形式はさまざまなものが要求されます。
特殊なヘッダ行を追加したいとか、ファイルの最後にレコード件数と定型の文字を入れたい、とか、細かな要求に応えるためには、今回のようなプログラムによるファイル操作が必要になってきます。覚えてしまえばそれほど難しいものではありませんので、しっかり使いこなしていきましょう。