ヘルプの森~Excel・Access・Office全般ヘルプデスクサイト

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を指定
 ヒント:

  引数に0を指定または省略すると、1~255の範囲のファイル番号を返します。
  引数に1を指定すると、256~511の範囲のファイル番号を返します。
  引数を省略するときは()も省略します。

関連ヘルプ

ブック内のすべてのワークシートで同じ処理を行う 《For Each~Next》
ブックを開くとき、閉じるときにマクロを自動実行したい 《イベント プロシージャ》
データを快速で検索するには 《Find》
アプリケーションを起動し動作させる 《Shell・SendKeys・Wait》
エラーの種類、そしてエラー処理の設置方法について 《On Error GoTo》
InputBox のテキスト ボックス入力時に日本語入力をオンにする 《SendKeys》
ExcelからOutlookでメールを作成・送信する基本のVBA 《CreateObject関数》
Excelのメールアドレス データを使用し、Outlookのメールを自動送信する 《CreateObject関数》
ソートしたグループごとのデータを別ブックに分割するサンプルVBA
右クリック、印刷、上書き保存などブックに規制をかける 《イベント プロシージャ Cancel=True》
フォルダー内のすべてブックを開いて同じ処理を行う 《Do~Loop・Dir》
フォルダー内のすべての画像ファイルをペイントで開きサイズ変更
フォルダー内のフォルダーとファイルの一覧をセルに書き出す1 《Dir》
フォルダー内のフォルダーとファイルの一覧をセルに書き出す2 《FileSystemObject》
フォルダー内のファイル名を変更する 《Do~Loop・Dir・Name~As》
ColorプロパティとRGB関数について、Color値からRGB、RGBからColor値を求める方法 《Color・RGB関数》
twitter hatena line pocket