VBAでテキストファイルを出力する一番簡単な方法は?
すぐ出来る方法が知りたい…
もうあるファイルに追記したいのにやり方がわからない…
文字コードを変えないといけないのに上手くできない
どこで設定できるの?
こんにちは!VBAでの作業効率化が好きすぎて、社内でVBA講師をしたこともある8年目文系プログラマの佐藤です。
みなさんは、エクセルのVBAでのテキストファイル出力を使いこなせていますか?
上記のようなお悩みをお持ちの方も多いのではないでしょうか。
テキストファイル出力は、思ったより簡単に出力できる反面、細かい設定をして出力しようとすると途端に難しくなってしまいます。
そして、挑戦してみようと検索したら結果にいろいろ方法が出てきて、初心者の方はどれを選んだらいいか分からなくなってしまいますよね。
この記事ではそんなお悩みを解決できるように、基本の方法から自分流設定で出力する方法の二つを解説していきます。
これから出力に挑戦する方は、ここで紹介する基本の方法で実践してみましょう。
すぐ出来るようになる方法を紹介していきます。
もちろんサンプルコードを使って分かりやすく解説していきますので、安心してくださいね。
自分流設定で出力したい方には、準備から解説していきますので一緒に方法について学習していきましょう。こちらもすぐ使える方法をわかりやすく解説していきます。
そして最終的にはこの記事全体の内容を使って、CSVファイルを出力するところまで実践していきます。
テキストファイルを出力できるようになれば、作業や業務の効率をさらに上げることができます。この記事で一緒に学習してマスターしましょう。
それでは、まずVBAでファイルを扱うときの基礎知識から解説していきます。
VBAでファイルを扱うときに知っていたいこと
この章では、この先の実践で役に立つ基礎知識を解説していきます。
なるべく分かりやすい言葉で解説していくので、一緒に学習していきましょう。
ファイルを「開く」のにも種類がある
ファイルを開くだけじゃないの?と思いますよね。ですが、VBAでファイルを開くときには種類があるんです。
この、「開く」種類で、出来ることが決まるので、次のような種類があることを忘れないようにしましょう。
種類 | 使う時 |
---|---|
Input | 読み込む時に使う |
Output | 書き込む時に使う |
Append | 追記したい時に使う |
InputとOutputはエクセルの立場で考えてみると覚えやすいです。
「エクセルにInputする」=「読み込む」
「エクセルからOutputする」=「書き込む」
慣れるまではどれで開けばいいんだっけ…となりがちなので、毎回確認してから作って慣れることをお勧めします。
開き方には他にも「バイナリモード」などが用意されていますが、よく使うのはこの表の3つです。
この後の実践では「Output」「Append」を実際に使いますので、この二つに関してはしっかりと覚えていきましょう。
VBAでファイルに書き込む方法の1つが、この「Output」などを使って開いたファイルに書き込む方法になります。
もう一つの方法は「ADODB.Stream」というものを使う方法です。
次の項目で、この2つの方法について詳しく解説していきます。
書き込む方法は2つある
現在でよく使われる方法は2つあります。どちらも使えるようになれば、いろいろなファイルに対応できます。
ここで2つの方法について学習していきましょう。
1つ目は、OutputかAppendでファイルを開いて、「print」という命令で一行ずつ書き込んでいく方法です。とても簡単で、事前の準備が要らないので、初めてやってみる方や、簡単なテキストを出力する時に使います。
ですが、この方法では文字コードを変えることが出来ません。
文字コードを変えたり、改行コードを簡単に変えたいなら「ADODB.Stream」を使う方法で出力します。この方法が2つ目の方法です。
「ADODB.Stream」は使う前に事前準備が必要ですが、文字コードなどを変更して出力することが出来ます。また、大量のデータを出力するならこちらのほうが速くできます。
それぞれの特徴を考慮して、その時の目的に合った方法を選んで出力していきましょう。
この記事では、まず1つ目の方法から具体的なやり方を解説していきます。その次に2つ目の方法の事前準備から解説していきます。
どちらもしっかりやり方に関して解説していきますので、安心してくださいね。
それでは早速、次の章で実践してみましょう!
一番簡単な方法でテキストファイルを出力してみよう
この章では、ファイルを開いて「print」で一行ずつ書き込んでいく方法を解説していきます。
まずはここで紹介する方法で、ファイル出力に慣れていきましょう。
基本の形を覚えよう
ここからは、ファイルを開いて書き込む方法を解説していきます。
ほとんどのテキストファイルはこの方法で出力できますので、サンプルコードを見ながらじっくり学習していきましょう。
サンプルコードでは、次のデータをそのままテキストファイルに出力してみます。
'テキストファイル出力 Public Sub TextOutput() 'ファイルを書き込みで開く(無ければ新規作成される、あれば上書き) Open "C:test.txt" For Output As #1 '開いたファイルに書き込む Print #1, Cells(1, 1).Value Print #1, Cells(2, 1).Value Print #1, Cells(3, 1).Value Print #1, Cells(4, 1).Value Print #1, Cells(5, 1).Value '開いたファイルを閉じる Close #1 '終わったのが分かるようにメッセージを出す MsgBox "完了!" End Sub
実行結果(test.txt):
買い物リスト にんじん たまねぎ じゃがいも 豚肉
セルの内容がそのままテキストファイルになって出力されました。
順番にコードを見ていきましょう。
まずは、次のようにファイルを開きます。今回は書き込みで開くため「Output」でファイルを開きましょう。
'ファイルを書き込みで開く(無ければ新規作成される、あれば上書き) Open "C:test.txt" For Output As #1
ファイルを開くときは「Open 開くファイルのパス For 開き方 As #1」と書きます。
この時、もし指定した名前のファイルがなくても新規作成されるので安心してください。あれば上書きされ、元の内容は消えてしまうので注意しましょう。
ForやAsはお決まりの言葉なのでそのまま書きます。
その次の#1は、開いたファイルの別の名前のようなものです。もし同時に2つのファイルを開きたい時には、後から開いた方に#2と付けます。
ファイルを1つしか開かないときは#1と書けば問題ありませんので、今回も#1と書いていきましょう。
次は早速「Print」を使って書き込んでいきます。
'開いたファイルに書き込む Print #1, Cells(1, 1).Value Print #1, Cells(2, 1).Value Print #1, Cells(3, 1).Value Print #1, Cells(4, 1).Value Print #1, Cells(5, 1).Value
Printを使うと、開いているファイルに内容を直接書き込んでくれます。
開いているファイルを指定する時は、先ほど説明した別の名前で指定するのがポイントです。
書き込む内容は、カンマの後に書いていきます。
ループを理解している方は、次のようにループを使って記載してみましょう!
'開いたファイルに書き込む Dim i As Integer For i = 1 To 5 Print #1, Cells(i, 1).Value Next
ループを学習してみたい、復習したい方は次の記事を読んでみてください。
今回使用したfor文以外にも、ループの方法を詳しく解説しています。
そして、最後に重要なポイントです。
開いたファイルはしっかり閉じましょう!
'開いたファイルを閉じる Close #1
閉じる時も、書き込む時と同じように別の名前で指定します。
しっかり閉じてあげないと、見えないところでテキストファイルが開いたままになってしまいます。
次の書き込みが出来ないなど、不具合が起きる可能性があるため、ファイルは忘れず閉じるようにしましょう。
以上でテキストファイル出力は完了です!
書く行数も少なく、わかりやすい内容なので、まずはこの方法から慣れていくことをお勧めします。
次は、「Append」を使って、すでにあるファイルに追記する方法を解説していきます。
すでにあるファイルに追記したい時はこの方法を使おう
追記するにはファイルを開くときに「Output」ではなく「Append」を使って書き込みます。
開き方を変えるだけで、追記が出来るようになります。先程のサンプルを少し修正して、追記出来るバージョンに変えてみましょう!
'テキストファイル出力 Public Sub TextOutput() Dim i As Integer 'ファイルを追記モードで開く Open "C:test.txt" For Append As #1 '開いたファイルに書き込む For i = 1 To 5 Print #1, Cells(i, 1).Value Next '開いたファイルを閉じる Close #1 '終わったのが分かるようにメッセージを出す MsgBox "完了!" End Sub
実行結果(test.txt):
買い物リスト にんじん たまねぎ じゃがいも 豚肉 買い物リスト にんじん たまねぎ じゃがいも 豚肉
結果に同じ内容が2回出力されています。上書きされず、しっかり追記することが出来ました。
変更した個所は「Output」の部分を「Append」にしただけです。
簡単に切り替えることが出来るので、目的に応じて「Output」と「Append」を使い分けて出力してみてくださいね。
次は、少し応用編です。
出力するファイルの場所を選びたい時に使える方法をご紹介します。
出力するファイルの場所を選べるようにしてみる
よく、ファイルを保存する時にはどこに保存するか選ぶ画面がでますよね。
あれをVBAで使うことも可能なんです。その方法を使って、選んだ場所にファイルを出力する方法を解説します。
サンプルコードに少し追記したものがこちらです。
'テキストファイル出力 Public Sub TextOutput() Dim i As Integer Dim folderName As String '保存場所を選ぶ画面を開く folderName = Application.GetSaveAsFilename(FileFilter:="テキストファイル,*.txt") 'ファイルを書き込みで開く Open folderName For Output As #1 '開いたファイルに書き込む For i = 1 To 5 Print #1, Cells(i, 1).Value Next '開いたファイルを閉じる Close #1 '終わったのが分かるようにメッセージを出す MsgBox "完了!" End Sub
先程のサンプルコードに追加されている部分がありますね、ここを詳しく見ていきましょう。
'保存場所を選ぶ画面を開く folderName = Application.GetSaveAsFilename(FileFilter:="テキストファイル,*.txt")
この一文で、「名前を付けて保存」画面を開くことが出来ます。
「名前を付けて保存」画面で決定したパスが変数folderNameに格納される流れになっています。
かっこの中の「FileFilter:=”テキストファイル,*.txt”」の部分では拡張子が.txtのファイルだけ保存できるようにフィルターをかけている部分です。
これで出力先を選べるようになりました。
毎回決まった場所に出力しないときには、ぜひこの方法を使ってみてください。
ファイルを開いて書き込む方法の紹介は以上です!
Openでファイルを開き、Printで書き込んで、Closeでファイルを閉じるだけなので、何度か実践すればすぐに慣れることができると思います。このサンプルコードを参考に何度も実践してみてくださいね。
次の章では、もう1つの方法である「ADODB.Stream」を使ったやり方について解説していきます。
まずは事前準備からやってみましょう!
自分流に設定してテキストファイルを出力してみよう
ここからは、設定を変えて出力する方法を紹介していきます。
先に準備があるので、そこから一緒に取り組んでいきましょう!
まずは準備からやってみよう
これから使う出力方法の「ADODB.Stream」は使う前に参照設定という特別な設定が必要です。やり方はとても簡単なので、画像を見ながら一緒にやってみましょう。
まずはツールから「参照設定」を選びます。
次に出てきた画面で「Microsoft ActiveX Data Objects 〇.〇 Library」を探してチェックを付けたらOKを押します。
たくさんあれば、一番数字の大きいものにチェックを付けましょう。
以上で準備は完了です!
ここまで出来たら、早速文字コードを変えてファイルを出力してみましょう。
文字コードをUTF-8に設定してみよう
先程まで紹介した方法で出力したファイルはすべて「Shift-JIS」という文字コードで出力されます。
ですが、Shift-JISのままだと、開く機械によって文字化けしてしまうときがあります。
そこで、今回は世界的によく使われる文字コードの「UTF-8」に変更して出力してみます。
ここで使うADODB.Streamは、ざっくり言うとデータの塊を保管しておけるものです。
保管する時に文字コードや、改行コードなどのルールも一緒に決めて保管しておくことが出来ます。
ADODB.Streamは閉じてしまうと内容が綺麗さっぱり消えてしまうため、閉じる前に内容をファイルに保存するという方法で行います。
'UTF-8でテキストファイル出力 Public Sub TextOutput_UTF8() Dim i As Integer 'ADODB.Streamオブジェクトを生成 Dim ado As Object Set ado = CreateObject("ADODB.Stream") 'ADODB.Streamで扱う文字コードを設定する ado.Charset = "UTF-8" 'ADODB.Streamを開く ado.Open '開いたADODB.Streamに内容を保管する 'adWriteLineは改行する時に入れる For i = 1 To 5 ado.WriteText Cells(i, 1).Value, adWriteLine Next 'ADODB.Streamに保管されている内容をファイルに保存する ado.SaveToFile "C:test.txt", 2 'ADODB.Streamを閉じる ado.Close '終わったのが分かるようにメッセージを出す MsgBox "完了!" End Sub
実行結果(test.txt):
買い物リスト にんじん たまねぎ じゃがいも 豚肉
出来たファイルの文字コードがUTF-8になりました!少し手順が多かったですが、順番に見ていきましょう。
まずは次のようにADODB.Streamを使うための宣言をして、ADODB.Streamを呼び出します。
'ADODB.Streamオブジェクトを生成 Dim ado As Object Set ado = CreateObject("ADODB.Stream")
次に使えるようになったADODB.Streamに文字コードを次の通り設定していきます。
'ADODB.Streamで扱う文字コードを設定する ado.Charset = "UTF-8"
Charsetは文字コードという意味です。今回はUTF-8にするため、こんな感じで入力します。
設定が終わったら、ADODB.Streamにデータを保管できるように「Open」を使って開きます。開かないとデータは入れることが出来ないので注意しましょう!
そして、開いたADODB.Streamに書き込みたいデータを入れていきます。
「WriteText」でデータを入れることができます。データの最後に改行を入れたい場合は「adWriteLine」をカンマの後に入れましょう。
最後に、ADODB.Streamに保管してあるデータを丸ごとファイルに保存します。
保存する時は「SaveToFile」と保存先を指定して、最後に2という数字を入れます。
保存したら、ADODB.Streamも最後にしっかり閉じましょう!
ファイルの時と同じで、開いたままになってしまうと不具合の原因になります。
これで、文字コードを変更しての出力は完了です!
もちろんUTF-8以外の文字コードでも同じ方法で出力できるので、状況に応じて文字コードを設定してみてください。
ここからは、UTF-8 BOM無しで出力する方法について少し紹介します。
今回、サンプルコードで出力するとBOM付きでの出力になります。
BOM無しで出力したい時は、19と21行目の間に以下の手順を加えます。
BOMはファイルの先頭に3バイト分の見えないデータが入っているので、その分ずらして保存し直す方法です。
ado.Position = 0 ’データをバイナリデータにする ado.Type = adTypeBinary ‘データの開始場所を3つずらす ado.Position = 3 ‘バイナリデータを一時保存 Dim bData() As Byte bData = ado.Read ado.Close ado.Open ado.Write bData
以上が、文字コードの変更方法でした。
手順は少し多いですが、いつもこの方法で変更することが出来るので、実践して覚えていきましょう。
次は、改行コードを変える方法を紹介してきます。
改行コードをLFに変えてみよう
文字コードと一緒に、改行コードも変えなければならない時があるかもしれません。
その時のために、改行コードの簡単な変え方を紹介します。
先程のサンプルコードで文字コードをしている部分がありましたが、そこに次の1文を足すだけで、改行コードをLFにすることが出来ます。
ado.LineSeparator = adLF
とても簡単ですよね。もちろん文字コードがUTF-8じゃない時も、改行コードを変えることはできます。
先程のサンプルコードにこの1文を追加して、出力されたファイルの改行コードがLFになっているのを是非確認してみてください。
以上で、自分流設定で出力する方法について解説しました。
すこし手順は増えましたが、内容はこちらも「Open」で開いて、「WriteText」で保管して、「SaveToFile」でテキストファイルに保存する流れになっています。
基礎が出来ていれば、この方法も簡単にマスターできると思いますので、いろいろなファイルを出力して慣れていきましょう。
次は、ここまでの学習内容を使ってCSVファイルを出力してみます。
CSVファイルの出力というだけで、少し難しそうと思うかもしれません。ですが、これまでの内容を使えばとても簡単に出力することができるんです。
早速、やり方について見ていきましょう。
ここまでの学習内容を使ってCSVファイルを出力してみよう
最後の練習に、ここまでの内容を使ってCSVファイルを出力してみましょう。
CSVファイルはカンマなどで区切られたデータの集まりです。
今回はカンマ区切りと、タブ区切りのファイルの作り方のサンプルコードを紹介していきます。
このデータを使ってやってみます。
サンプルコードはこちらです
'CSV出力 Public Sub TextOutput() Dim i As Integer Dim r As Integer Dim csvData As String 'ファイルを書き込みで開く Open "C:test.csv" For Output As #1 For i = 1 To 5 csvData = "" For r = 1 To 3 If r = 1 Then '1つ目はそのまま変数に入れる csvData = Cells(i, r).Value Else 'データの間にカンマを入れて変数に入れる csvData = csvData & "," & Cells(i, r).Value End If Next '開いたファイルに書き込む Print #1, csvData Next '開いたファイルを閉じる Close #1 '終わったのが分かるようにメッセージを出す MsgBox "完了!" End Sub
実行結果(test.csv):
買い物リスト,価格,個数 にんじん,100,1 たまねぎ,120,3 じゃがいも,100,3 豚肉,300,1
始めに学習したファイルを開いて書き込む方法でCSVファイルを出力しました!出力に使う方法は最初に学習したものと一切変わりません。
ループを使い、データとデータの間にカンマを入れる部分を工夫すれば、学習した内容だけであっさりCSVファイルを出力することが出来ます。
もし、タブ区切りのCSVを作りたい場合はカンマを入れている18行目を次のように変更してみてください。
'データの間にカンマを入れて変数に入れる csvData = csvData & vbTab & Cells(i, r).Value
VBAでタブを入力したい時は直接タブを入れるのではなく、「vbTab」と入力します。
結果はこうなっています。
実行結果(test.csv):
買い物リスト 価格 個数 にんじん 100 1 たまねぎ 120 3 じゃがいも 100 3 豚肉 300 1
しっかりタブ区切りのCSVファイルとして出力することが出来ました。
これでCSVファイルの出力もばっちりです。
ここまで学習してきた皆さんなら、簡単な内容だったのではないでしょうか?
カンマやタブを入れたところを他の文字に変えれば、もちろん違う区切り文字のCSVを作ることもできますので、いろいろ試してみてくださいね!
以上で、2つの方法でテキストファイルを出力する方法を解説しました。
基礎を覚えてしまえば、あとは工夫次第でどんなテキストファイルでも出力できます。
あとは実践あるのみなので、サンプルコードをアレンジしてたくさんファイルを出力してみてください。
まとめ
VBAでテキストファイルを出力する方法について、サンプルコード多めで解説しました。やってみると思ったより簡単だったと感じてもらえると嬉しいです。
始めは完成までに時間がかかってしまうこともあるかもしれません。慣れるまで、何度も実践していきましょう。
実践中に分からないことが出てきたら、またこの記事を読んで一緒に学習していきましょう。
それでは、次の解説で!