この記事ではエクセルシート上に記載されているデータを、表形式のままでテキストファイルに出力する方法をご紹介していきます。
他のソフトにデータを読み込ませる際などに非常によく出くわす状況だと思います。
ぜひやり方をマスターしておきましょう。
それではさっそくやっていきます。
やりたいことの事前確認
この記事の内容があなたのやりたいことと一致していない可能性もありますので、まずはどんなことをやっていくかを簡単にご紹介していきます。
今回は以下の画像のようにエクセルシートのA1セルからC5セルまでに記入されたデータをこの表形式を維持したまま、テキストファイルに出力する方法をご紹介したいと思います。
今回は5行×3列の表ですが、基本的に表の大きさはプログラムを書き換えればいくらでも変更可能です。
ご自身の業務内容に応じてプログラムを変更してください。
セルデータをテキス出力するサンプルコード
それではさっそくですが、上記の表をテキストファイルに出力する方法をご紹介します。
今回はいくつかのパターンに分けてテキスト出力をする方法をご紹介します。
※VBAを用いますので、まずは以下の記事を参考にVBAをつかってコードを記述できる状態にしておきましょう。
出力範囲がわかっている場合①
まずはテキストに出力するセル範囲がわかっている場合を想定したコートを紹介します。
以下がそのサンプルコードです。
Sub make_text_1()
Dim i As Integer, j As Integer
Open ThisWorkbook.Path & "\output1.txt" For Output As #1
For i = 1 To 5
For j = 1 To 2
Print #1, Cells(i, j) & vbTab;
Next
Print #1, Cells(i, j)
Next
Close #1
End Sub
このコード内にある
For i = 1 to 5 が行の繰り返し回数を
For j= 1 to 2 が列の繰り返し回数を示しています。
例えばA1セルからE20セルまでをしていしようと思えば
For i = 1 to 20
For j= 1 to 4
と書き換えればOKです。
「iの繰り返し回数は指定した行数と一致しているのに、jの繰り返し回数は指定した列数よりも1つすくなくしているの?」
と思ったかたは多いのではないでしょうか?
ここに関しては後半のポイント解説で解説します。
まずは難しいことは考えずに、コードをコピーして実際に動かしてみましょう。
しっかりと狙いの範囲が出力されているはずです。
出力範囲がわかっている場合②
「やり方はわかったけど、For Nextが二重になっていてなんとなく難しい。」
「もう少しわかりやすいやり方はないのかな。」
と思っているそこのあなたへ。
これでどうでしょうか?
Sub make_text_2()
Dim i As Integer
Open ThisWorkbook.Path & "\output2.txt" For Output As #1
For i = 1 To 5
Print #1, Cells(i, 1) & vbTab; Cells(i, 2) & vbTab; Cells(i, 3)
Next
Close #1
End Sub
先ほどのパターンと違い、このように列側のテキスト出力はループさせることなく一つのコードで完結させることも可能です。
列の範囲がそれほどい大きくない場合はこの方が手っ取り早いかもしれませんね。
出力範囲が毎回変わる場合
「エクセルの出力範囲が毎回変わることがあるので出力範囲も自動で変更できるようにできないかな?
」
次はこんな悩みを解決するコードを紹介します。
Sub make_text_3()
Dim i As Integer, j As Integer
Open ThisWorkbook.Path & "\output3.txt" For Output As #1
i = 1
Do Until Cells(i, 1) = ""
j = 1
Do Until Cells(1, j) = ""
Print #1, Cells(i, j) & vbTab;
j = j + 1
Loop
Print #1, Cells(i, j)
i = i + 1
Loop
Close #1
End Sub
どんどん難しくなっていきましたね。
ですが基本的にやっていることは出力範囲がわかっている場合①で紹介したことと同じです。
このコードではFor Nextで繰り返し回数(テキスト出力範囲)を指定するのではなく、Do Loopでセルが空欄になるまで繰り返せ!という処理を行っています。
とはいえ、これはA列と1行目が空欄なく端までしっかり埋まっていることが前提となります。
もし、途中に空欄のセルがある場合は、出力する範囲の一番端のセルを探索してから出力範囲がわかっている場合①の手法を使うのが良いでしょう。
以下が最終的な出力結果です。
どのやり方でも同じように表形式でエクセル内のデータがテキストファイルに出力されていますね。
というわけでここまでが、おおざっぱなスキル解説になります。
サンプルコードの詳細解説
プログラミングコードの紹介は以上ですが、ここからは今回紹介したコードの中で、覚えておいた方が良いポイントをご紹介していきます。
今後VBAを使いこなせるようになりたい方は是非勉強していってください。
セミコロン(;)の意味
今回のコードにある
Print #1, Cells(i, j) & vbTab;
という形でvbTabの後ろにセミコロン(;)がいくつか出てきたと思います。
このセミコロン(;)には改行するな!という意味があります。
先ほど紹介した出力範囲がわかっている場合①のコードを変更し、
このセミコロンをなくして以下のようにした場合どうなるか見てみましょう。
Sub make_text_1()
Dim i As Integer, j As Integer
Open ThisWorkbook.Path & "\output1.txt" For Output As #1
For i = 1 To 5
For j = 1 To 2
Print #1, Cells(i, j) & vbTab 'セミコロンを削除
Next
Print #1, Cells(i, j)
Next
Close #1
End Sub
この場合は以下のように出力されます。
改行するな!という命令をなくした結果、一つのセルデータを出力するごとに改行されてしまっていますね。
これでは改めてファイルを読み込んだ際にどんな表だったのかを読み解くことはできませんのでご注意ください。
For Nextの罠
冒頭にも少し触れましたが、出力範囲がわかっている場合①のコードでは、
iの繰り返し回数は指定した行数と一致しているのに対して、jの繰り返し回数は指定した列数よりも1つ少なくなっています。
ここについて解説します。
なぜこのように記述するかというと、
VBAではFor Nextを終える際、ループさせる整数は To で指定した数値から1足されて終了するからです。
そのため一つ目のNextを終えた段階ではj=3になっています。
よって二つ目のPrint指示をする際はj=3、すなわちC列をしっかりと出力してくれるというわけです。
ここは複雑な処理をする際に間違えがちなポイントですので是非覚えておきましょう。
おわりに
いかがでしたでしょうか?本格的なプログラミングやCAEを業務で取り扱っている場合、今回紹介したようにエクセルデータをテキストファイルに出力する機会は多いと思います。
是非このスキルをマスターし業務の効率化に取り組んでいきましょう。
また、今回とは逆にテキストファイルをエクセルシートに取り込む方法も以下の記事で紹介しています。
【VBA】マクロでテキストファイルの読み込み!区切り有無で解説!
このように、私のブログではエクセルスキルはもちろん、様々なプログラミングスキルを紹介しています。
今は仕事中で時間がないかもしれませんが、ぜひ通勤時間中などに他の記事も読んでいただけると嬉しいです。
⇒興味をもった方は【ヒガサラ】で検索してみてください。
確実にスキルアップできるはずです。
最後に、この記事が役に立ったという方は、ぜひ応援よろしくお願いします。
↓ 応援ボタン
それではまた!
コメント