No.007
Excelのデータをテキスト ファイルに書き出す(出力する) 《Open・Print・Close》
2003/2007/2010/2013
Excelのデータをテキスト ファイルに書き出したい、というお問い合わせです。
以外に簡単な記述でできますよ。
テキスト ファイルを開いてデータを書き出し、テキスト ファイルを閉じる、という流れの基本構文は、次のようになります。
Open "テキスト ファイル名" For Output As #番号
Print #番号, データ
Close #番号
開くOpen、書き出すPrint、閉じるCloseの3行です。これらはメソッドです。
1行目にある「Output」のところを「Append」と替えることもできます。
Open "テキスト ファイル名" For Append As #番号
「Output」と「Append」の違いは、テキスト ファイルが既存のファイルであったとき、それまでのデータを消して新規にデータを書き込むのが「Output」、それまでのデータの末尾に書き足すのが「Append」です。
テキスト ファイルが存在しない新しいファイルで指定した場合は、指定したテキスト ファイルが新しく作成され、その場合「Output」でも「Append」でも新規にデータが書き込まれます。
では、もう少し具体的なサンプルをご紹介していきます。
ExcelのセルA1よりデータが何件か続けて入力されており、データがある分、指定したテキスト ファイルに書き出し、テキスト ファイルを閉じます。
Sub Sample1()
Dim R_data As Integer '行番号
R_data = 1
Open "D:¥Documents¥Data.txt" For Output As #1
Do While Cells(R_data, 1) <> ""
Print #1, Cells(R_data, 1)
R_data = R_data + 1
Loop
Close #1
End Sub
テキストファイル名はフルパス拡張子までの文字列、As #番号のファイル番号は任意の番号を最後まで合わせてください。
同じ場所に同じファイルがあった場合は、上書きされますので注意してください。もしくは、うまく利用してください。
先のサンプルはテキスト ファイルは1つ作成されるのですが、Excelのデータの数分のテキスト ファイルを作る場合は、ループ内でOpenし、Printし、Closeします。
以下サンプルが2つあります。
Sub Sample2()
Dim R_data As Integer '行番号
Dim n As Integer '連番用
R_data = 1
n = 1
Do While Cells(R_data, 1) <> ""
Open "D:¥Documents¥Data" & n & ".txt" For Output As #1
Print #1, "test"
Print #1, Cells(R_data, 1)
Close #1
R_data = R_data + 1
n = n + 1
Loop
End Sub
サンプルでは、各テキスト ファイル1行目に「test」、2行目にその行のA列のデータが書き出されます。
今回はファイル名が競合しないように、「Data1.txt」などと連番nをふるようにしていますが、連番でなくセルの値をファイル名に入れることもできますね。それは、次のサンプルを参考にしてください。
Sub Sample3()
Dim R_data As Integer '行番号
Dim n As Integer 'FreeFile番号格納用
R_data = 1
Do While Cells(R_data, 1) <> ""
n = FreeFile
Open "D:¥Documents¥Data" & Cells(R_data, 2) & ".txt" For Output As #n
Print #n, "test"
Print #n, Cells(R_data, 1)
R_data = R_data + 1
Close #n
Loop
End Sub
サンプル2と違うのは、作成するテキスト ファイル名にその行B列の値を入れていることと、何やらFreeFileというのが入っています。これは、FreeFile関数です。
VBAやVBなどで、大量のファイルの出入力をする際、今回のOpenメソッドなどで、ファイル番号が競合するとエラーとなります。
そこで空いているファイル番号を割りふってくれるFreeFile関数を使用して、他のファイルと重複を避けることができます。
また、Closeメソッドによってファイル番号は解放されます。
実は上記のサンプルは、ループ内のCloseメソッドによりファイル番号は開放されますので、わざわざFreeFile関数は使う必要はなく、すべて#1でも構いません。
ただ様々なサンプルには、明示的にFreeFile関数を使用されていることも多いですので、知っておくといいと思います。
ヘルプmemo
<FreeFile関数>
使用可能なファイル番号を整数型(Integer)の値で返します。。
構文: FreeFile[(rangenumber)]
引数:
rangenumber …0(既定)または1を指定
ヒント:
引数に1を指定すると、256~511の範囲のファイル番号を返します。
引数を省略するときは()も省略します。