テキストファイル出力

ExcelVBAのプログラムを使って、テキストファイルに文字列を書き出して見たいと思います。まず、WriteLineメソッドという一行分文字列をファイルに書き込むメソッドがあります。引数に「abcd」という文字列を指定すると、テキストファイルに「abcd」という文字列を書き込んで改行してくれます。たとえばあるメッセージを書き込む場合はこんな感じにします。(※objTSはオブジェクトです。)

メッセージプログラム

こんにちは。リスです。


元気にしていますか。




では。

objTS.WriteLine "こんにちは。リスです。"
objTS.WriteLine ""
objTS.WriteLine "元気にしていますか。"
objTS.WriteLine ""
objTS.WriteLine ""
objTS.WriteLine "では。"

改行のみの行はWriteBlankLines (改行数)メソッドを使うことができます。

メッセージプログラム

こんにちは。リスです。


元気にしていますか。




では。

objTS.WriteLine "こんにちは。リスです。"
objTS. WriteBlankLines (1)
objTS.WriteLine "元気にしていますか。"
objTS. WriteBlankLines (2)
objTS.WriteLine "では。"

ここでいう、objTSはTextStreamというオブジェクトです。TextStreamはFileSystemObjectから取得できます。以下のようにします。

    'FileSystemObject生成
    Dim objFS As FileSystemObject
    Set objFS = CreateObject("Scripting.FileSystemObject")
    
    'TextStreamオブジェクト取得(ファイルを開く)
    '(追記モードでファイルが存在しない場合は作成する)
    Dim objTS As TextStream
    Set objTS = objFS.OpenTextFile("C:\work\test.txt", ForAppending, True)
    Set objFS = Nothing '←FileSystemObjectは解放しておく

最初にFileSystemObjectを生成して、最後から2行目の部分でOpenTextFileというメソッドを呼び出します。OpenTextFileの第一引数は操作するファイル名をフルパスで指定します。第二引数には読み取りなのか書き込みなのか追記なのかを指定します。(今回は追記モードを指定しています。)第三引数には第一引数で指定したファイルがなかった場合、新たに作成するか指定します。(今回は作成するように指定しています。)、今回は省略していますが、第四引数にはファイルの形式がUnicodeなのかASCIIなのかシステムのデフォルトにするかを指定します。省略した場合はASCII形式でファイルを開きます。これでメッセージは書き込めます。メッセージを書き込んだらちゃんと最後にオープンしたファイルをcloseメソッドで閉じて、オブジェクトを解放します。全体的には以下のようになります。

Sub risu_no_message()
    'FileSystemObject生成
    Dim objFS As FileSystemObject
    Set objFS = CreateObject("Scripting.FileSystemObject")
    
    'TextStreamオブジェクト取得(ファイルを開く)
    '(追記モードでファイルが存在しない場合は作成する)
    Dim objTS As TextStream
    Set objTS = objFS.OpenTextFile("C:\work\test.txt", ForAppending, True)
    Set objFS = Nothing '←FileSystemObjectは解放しておく
    
    '書き込み処理
    objTS.WriteLine "こんにちは。リスです。"
    objTS.WriteBlankLines (1)
    objTS.WriteLine "元気にしていますか。"
    objTS.WriteBlankLines (2)
    objTS.WriteLine "では。"

    '終了処理
    objTS.Close '←ファイルを閉じる
    Set objTS = Nothing '←TextStreamObjectの解放
End Sub

これを利用して、Excelのセルの内容をテキストに出力するプログラムを作成してみます。プロシージャの引数に出力するセルの範囲(今回は最大出力行と最大出力列)を指定して、セルの範囲を限定します。y行目とx列目というような感じでループさせ、必要なセルの文字列を取得し書き込んでいきます。これは、1行分のセルの文字列をすべてくっつけてファイルに書き込みます。書き込みが終わったら次の行に行くというような感じです。Format(Date, "yyyymmdd")は現在の日付をフォーマットした文字列をかえしています。( 例えば 20091108 ) Format(Time, "\[時刻:hh:nn:ss\]") は現在の時刻をフォーマットした文字列をかえしています。( 例えば [時刻:20:42:11] ) objFS.BuildPathメソッドは第一引数と第二引数を「\」でつなげて、ファイルのフルパスを作成しています。

Private Sub textWrite(ByVal yMax As Integer, ByVal xMax As Integer)
    
    '--------------------------------
    '事前処理
    '--------------------------------
    'FileSystemObject生成
    Dim objFS As FileSystemObject
    Set objFS = CreateObject("Scripting.FileSystemObject")
    
    '書き込むファイル名の設定
    Dim fName As String
    fName = Format(Date, "yyyymmdd") & "_検索結果.txt"

    '書き込むファイルのフルパスの設定
    '(パスはカレントディレクトリにする)
    Dim fPath As String
    fPath = objFS.BuildPath(ThisWorkbook.Path, fName)
    
    '--------------------------------
    '書き込み処理
    '--------------------------------
    'TextStreamオブジェクト取得(ファイルを開く)
    '(追記モードでファイルが存在しない場合は作成する)
    Dim objTS As TextStream
    Set objTS = objFS.OpenTextFile(fPath, ForAppending, True)
    Set objFS = Nothing '←FileSystemObjectは解放しておく
    
    '書き込み実施
    objTS.WriteLine Format(Time, "\[時刻:hh:nn:ss\]")  '←時刻を書き込む
    Dim y As Integer
    Dim x As Integer
    Dim strBuf As String
    For y = 1 To yMax   '←引数の行分まわす
        For x = 1 To xMax   '←引数の列分まわす
            'セルの文字列をバッファに追加
            strBuf = strBuf & Cells(y, x).value & vbTab
        Next x
        objTS.WriteLine strBuf '一行分書き込む
        strBuf = ""    '←1行分のバッファを初期化
    Next y
    
    objTS.WriteBlankLines (1)  '←1つ改行を書き込む
    
    '--------------------------------
    '終了処理
    '--------------------------------
    objTS.Close '←ファイルを閉じる
    Set objTS = Nothing '←TextStreamObjectの解放
    MsgBox "テキストに書き込みました。" & vbCr & "(" & fName & ")"
    
End Sub

このプロシージャを呼び出すときは以下のようにします。

Public Sub test()
    '1行目の1列目から9行目の4列目までファイルに出力します。
    Call textWrite(9, 4)
End Sub