UTF-8形式のテキストファイルに書き込む


本稿で紹介する「テキストファイルの操作」は、UTF-8形式のテキストファイルを対象にしています。Shift-JIS形式のファイルを扱うときは、下記ページをご覧ください。

テキストファイルを操作する

正確には「UTF-8形式のファイル」ってのも、ちょっと変な表現なんですけどね。ファイルの形式じゃなくて、そこで使われている文字コードが"UTF-8"だよってことなんですが。まぁ、細かいことはいいとして。ここでは面倒なので「UTF-8形式のファイル」「Shift-JIS形式のファイル」という呼び方をします。

UTF-8の文字コードでファイルに書き込むには、次のようにします。

Sub Sample1()
    Dim Target As String
    Target = "D:\Work\Sample.txt"
    With CreateObject("ADODB.Stream")
        .Charset = "UTF-8"
        .Open
        .WriteText "田中", 1
        .SaveToFile Target, 2
        .Close
    End With
End Sub

WriteTextメソッドが、書き込む命令です。第2引数に「1」を指定すると、書き込むデータ(上では"田中")の後ろに改行コードを書き込みます。

Sub Sample1()
    Dim Target As String
    Target = "D:\Work\Sample.txt"
    With CreateObject("ADODB.Stream")
        .Charset = "UTF-8"
        .Open
        .WriteText "田中", 1
        .WriteText "鈴木", 1
        .WriteText "佐藤", 1
        .SaveToFile Target, 2
        .Close
    End With
End Sub

第2引数を省略するか「0」を指定すると、末尾に改行コードを書き込みません。

Sub Sample1()
    Dim Target As String
    Target = "D:\Work\Sample.txt"
    With CreateObject("ADODB.Stream")
        .Charset = "UTF-8"
        .Open
        .WriteText "田中", 0
        .WriteText "鈴木"
        .WriteText "佐藤"
        .SaveToFile Target, 2
        .Close
    End With
End Sub

SaveToFileメソッドが、ファイルに保存する命令です。第1引数には、保存したいファイルの名前を指定します。第2引数は、ちょっとややこしいです。

指定したファイルが存在する場合 指定したファイルが存在しない場合
1 実行時エラーになる 作成して書き込む
2 上書きする 作成して書き込む

指定したファイルが存在しないときは、いずれにしても新しく作成してくれて書き込まれます。もし、指定したファイルがすでに存在しているとき、引数に「1」を指定していると実行時エラーになります。引数に「2」を指定していると、それまでファイルに記録されていたデータはすべて消えて、新しいデータが上書きされます。

ワークシート上のデータを書き込むなら、たとえば次のような感じでしょうか。ここでは、CSVデータとして書き込んでみます。

Sub Sample2()
    Dim Target As String, i As Long, j As Long, buf As String
    Target = "D:\Work\Sample.csv"
    With CreateObject("ADODB.Stream")
        .Charset = "UTF-8"
        .Open
        For i = 2 To 8
            buf = ""
            For j = 1 To 3
                buf = buf & Cells(i, j) & ","
            Next j
            .WriteText Left(buf, Len(buf) - 1), 1
        Next i
        .SaveToFile Target, 2
        .Close
    End With
End Sub

追記するには

ADOを使って、既存データの末尾に新しいデータを追記するには、少しだけ手間がかかります。ここでは、上で作成した「Sample.csv」の末尾に、新しいデータを追記してみます。

Sub Sample2()
    Dim Target As String
    Target = "D:\Work\Sample.csv"
    With CreateObject("ADODB.Stream")
        .Charset = "UTF-8"
        .Open
        .LoadFromFile Target
        .Position = .Size
        .WriteText "田中,2016/4/30,999", 1
        .SaveToFile Target, 2
        .Close
    End With
End Sub

追記するときは、次のように考えます。

.LoadFromFile Target → まず既存データを全部読み込みます。

.Position = .Size → 書き込み位置をデータの末尾に移動させます。

書き込み位置は、Positionプロパティで設定できます。Sizeプロパティは、読み込んだデータの大きさを返しますので、書き込み位置をデータの大きさに移動するということは、つまりデータの末尾に書き込み位置を移動するということです。

.WriteText "田中,2016/4/30,999", 1 → データの末尾に新しいデータを書き込みます。

SaveToFileメソッドの第2引数に「2」を指定していますので、指定したファイルが存在すると、既存データを消して今回の新しいデータだけを書き込みます。でも、今回書き込む新しいデータには、すでに既存データを読み込んでいますので、結果的に追記されるという仕組みです。