テキストファイル(.txt)等、エクセル以外のファイルをVBAから操作したい場合があります。
VBAを使えば、指定したファイルの内容を読み込んだり、ファイル自体を作成したりすることができます。
テキストファイルの作成
早速テキストファイルの作成を行ってみましょう。
以下はテキストファイルを作成し、適当な文字列を数行書き込むコードです。
'テキストファイルを作成するテスト
Sub outputtest()
Dim ff As Long
Dim filename As String
filename = ThisWorkbook.Path & "\text.txt"
ff = freefile 'フリーファイル変数
Open filename For Output As #ff
Print #ff, "テキストファイルを"
Print #ff, "出力する"
Print #ff, "テストプログラム"
Print #ff, "です。"
Close #ff
End Sub
ファイル名としてthisworkbookpath & "text.txt"を指定しており、エクセルファイルのあるフォルダ内にtext.txtという名前のtxtファイルを作成します。
freefileはプログラムからファイルを特定するための番号を自動で振ってくれる特殊な関数です。
ここではoutput(出力モード)でopen(ファイルを開く)しており、『print #ファイル番号 , "テキスト"』と記述することでテキストを追加することができます。ファイルは新たに作成されます。
最後にファイルを閉じて終了です。ここで閉じないと、プログラムが終了して画面上に何も表示されていなくとも、内部的にファイルが開きっぱなしになって予期しない状況が起こる場合がありますので、注意してください。エラー等で開いたファイルを閉じ損ねた場合はタスクマネージャから終了させるようにしましょう。
出力以外のモード
ファイルを開く際のモードとして、output以外にinput(入力)やappend(追加)、binary(バイナリ)等のモードがあります。
基本的に出力するときはoutput、入力するとき(ファイルを読み込むとき)はinputモードを使います。
以下は先ほど作成したtest.txtを入力モードで開き、内容を1行ずつ読み取ってセルに表示するプログラムです。
ここでは条件が成立するまでループを行う、『Do Until ~ Loop』構文を利用しています。VBAではEOFによってテキストファイルの最終行を判定します。
'テキストファイルを読み込むテスト
Sub inputtest()
Dim i As Long
Dim ff As Long
Dim filename As String
Dim buf As String
filename = ThisWorkbook.Path & "\text.txt"
ff = freefile
Open filename For Input As #ff
Do Until EOF(ff) 'EOF(最終行を示すフラグ)が立つまでループ
i = i + 1
Line Input #ff, buf
Cells(i, 1) = buf
Loop
Close #ff
End Sub
ファイル入出力を覚えると、VBAを使って作ることができるプログラムの範囲が飛躍的に広がります。ぜひ身につけてください。
CSVファイル
ファイルには画像ファイルや音声ファイルなど様々な種類があります。
このページではテキストファイル(.txt)を扱いましたが、同じようにテキストを扱う一般的なファイル形式としてCSVファイルがあります。
CSVは"Comma-Separated Values"の略で、カンマでテキストを区切ったファイル形式です。
カンマ(,)は文字列としても使われますが、CSVではカンマをセパレータ(区切り)として認識します。
例えば新しいファイルを開き"これは,CSV,形式です"という文字列を"test.csv"として保存してみましょう。
このファイルをテキストエディタで開くと当然文字列がそのまま表示されますが、エクセルで開くと以下のように文字列がカンマで区切られて表示され、カンマ(,)自体は見えません。
上記のようにCSVファイルはエクセルで開いた時に見やすい形を作りやすいため、CSVファイルという形式を覚えておくとプログラムで処理した結果をファイル出力するときに便利です。
プログラムから扱う場合も、テキストファイルを解析するよりCSVで予めデータの並びなどのフォーマットを決めておいた方が使いやすいことが多いです。
上でテキストファイルを出力したコードの.txtを.csvに変えるだけで、CSVファイルを出力することができます。
CSV作成時に気を付けること
CSVファイルをエクセルで開くと、通常のエクセルと同じように作業を行うことができますが、エクセルファイルと異なり中身はカンマで区切られた文字列のデータです。
このため、エクセルファイルのつもりで文字色を変更したり罫線を追加したりしても、CSVファイルとしては保存できません。
また、セルに入力したエクセルのワークシート関数は基本的にCSVファイルとして保存してエクセルで開いた時にも機能しますが、関数の文字列にカンマが含まれる場合、そこで区切られている(隣のセルの値である)と判断されるため、期待した通りにはなりません。
たとえば"=A2+A4"なら大丈夫ですが、"=sum(A2,A4)"だと"=sum(A2"と"A4)"という文字列とみなされてしまいます。
単純な足し算であれば上の例のようにsum関数を使わずに書き換えることができますが、複数の引数をカンマでつなげる必要があるワークシート関数("=IF(論理式,[真の場合],[偽の場合])"など)を含むファイルをCSV形式で出力しようとすると失敗するので、注意が必要です。