本稿で紹介する「テキストファイルの操作」は、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」を指定していますので、指定したファイルが存在すると、既存データを消して今回の新しいデータだけを書き込みます。でも、今回書き込む新しいデータには、すでに既存データを読み込んでいますので、結果的に追記されるという仕組みです。