ヒガサラblog

サラリーマン向けに、仕事を効率良く進めていくための方法についてご紹介しています。プログラミングから対人スキルまでを幅広く掲載中。

ヒガサラblog

【VBA】セルデータをテキストに!表形式での出力演習!

f:id:yshgs_elec:20200811142509j:plain



エクセルで処理したデータを別のプログラミング言語に読み込ませたい。
一度テキストファイルに出力する必要があるんだけど手作業だと面倒だ。

 

 

この記事ではこんな悩みを解決します。

 

エクセルは非常に便利ではあるものの、他のプログラミングソフトとの互換性はそれほど高くはありません。

 

そはいえ、データ整理をする際にはエクセルは非常に便利なもの。

 

計算したエクセルシートをテキストファイルに出力したいという人は多いのではないでしょうか。

 

私もプログラミングやCAEをやっているので頻繁にそういった操作が必要になりますね。

 

また、エクセルファイルはちょっとした文字を入力しているだけでも、数キロバイトというデータ容量になります。

 

一方でテキストファイルであれば数バイト。約1/1000にまで容量を削減できます。

 

計算だけはエクセルで実施し、得られたデータはテキストに保存する。

こうするだけでもかなりの容量節約につながります。

 

というわけで、この記事ではエクセルシートに記入されたデータを表形式のまま、テキストファイルに自動で出力する方法をご紹介します。

 

 

 

例題確認

本文今回は以下の画像のようにエクセルシートのA1セルからC5セルまでに記入されたデータをテキストファイルに出力する方法をご紹介したいと思います。

 

今回は5行×3列の表ですが、基本的に表の大きさはプログラムを書き換えればいくらでも変更可能です。

 

ご自身の業務内容に応じてプログラムコードを変更してください。

 

f:id:yshgs_elec:20200811211149j:plain

 

テキスト出力コード

それではさっそくですが、上記の表をテキストファイルに出力する方法をご紹介します。

 

今回はいくつかのパターンに分けてテキスト出力をする方法をご紹介します。

 

※VBAを用いますので、まずは以下の記事を参考にVBAをつかってコードを記述できる状態にしておきましょう。

【初心者用】エクセルマクロ(VBA)の始め方を詳細解説 - ヒガサラblog

 

 

出力範囲がわかっている場合①

まずは決まりきった形式が存在しており、テキストに出力するセル範囲が毎回変わらない場合を想定したコートを紹介します。

このコード内にある

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つすくなくしているの?

と思ったかたは多いのではないでしょうか。

 

ここに関しては後半のポイント解説で解説します。

まずは難しいことは考えずに、コードをコピーして実際に動かしてみましょう。

しっかりと狙いの範囲が出力されているはずです。

 

 

Sub make_text_1()
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が二重になっていてなんとなく難しい。
もう少しわかりやすいやり方はないのかな。

 

ここまできてなんだかFor Nextが二重になっていた直観的にわかりにくい!

 

確かに直観的にわかりにくいですね。
これならどうかな?

 

Sub make_text_2()
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()
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行目が空欄なく端までしっかり埋まっていることが前提となります。

もし、途中に空欄のセルがある場合は、出力する範囲の一番端のセルを探索してから出力範囲がわかっている場合①の手法を使うのが良いでしょう。

 

 以下が最終的な出力結果です。

どのやり方でも同じように表形式でエクセル内のデータがテキストファイルに出力されていますね。

f:id:yshgs_elec:20200812140730j:plain

スキルのポイント解説

プログラミングコードの紹介は以上ですが、ここからは今回紹介したコードの中で、覚えておいた方が良いポイントをご紹介していきます。

今後VBAを使いこなせるようになりたい方は是非勉強していってください。

 

セミコロン(;)の意味

今回のコードにある

Print #1, Cells(i, j) & vbTab;

という形でvbTabの後ろにセミコロン(;)がいくつか出てきたと思います。

 

このセミコロン(;)には改行するな!という意味があります。

 

 

先ほど紹介した出力範囲がわかっている場合①のコードを変更し、

このセミコロンをなくして以下のようにした場合どうなるか見てみましょう。

Sub make_text_1()
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

 

この場合は以下のように出力されます。

改行するな!という命令をなくした結果、一つのセルデータを出力するごとに改行されてしまっていますね。

これでは改めてファイルを読み込んだ際にどんな表だったのかを読み解くことはできませんのでご注意ください。

f:id:yshgs_elec:20200812142236j:plain

For Nextの罠

冒頭にも少し触れましたが、出力範囲がわかっている場合①のコードにて

iの繰り返し回数は指定した行数と一致しているのに、jの繰り返し回数は指定した列数よりも1つ少なくなっています。

 

ここについて解説します。

 

なぜこのように記述するかというと、

VBAではFor Nextを終える際、ループさせる整数は To で指定した数値から1足されて終了するからです。

 

そのため一つ目のNextを終えた段階ではj=3になっています。

 

よって二つ目のPrint指示をする際はj=3、すなわちC列をしっかりと出力してくれるというわけです。

 

ここは複雑な処理をする際に間違えがちなポイントですので是非覚えておきましょう。

終わりに

いかがでしたでしょうか?本格的なプログラミングやCAEを業務で取り扱っている場合、今回紹介したようにエクセルデータをテキストファイルに出力する機会は多いと思います。是非このスキルをマスターし業務の効率化に取り組んでいきましょう。

 

それではまた!

 

 

 

関連記事

www.higashisalary.com

www.higashisalary.com