今更ながらエクセルのマクロでCSVの自動出力をしてみた

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

9月の半期シメ=デスマーチのため、しばらくBlog記事執筆から遠ざかっていたばっしーです。

夏が終わって涼しくなったと思ったら、すっかり秋も深まっていていつの間にか初冬の雰囲気さえありますよね。よく、「日本には四季がある」なんて言われていますが、実は「二季」しかないんじゃないかと思ったり、思わなかったり。

それにしてもこう寒くなると、ビールよりも日本酒ですね。おいしいお酒は冷はもちろん、常温でもおいしくいただけるし、温燗でもいけるのが良いですね。熱燗だともったいないかも?というときには常温や温燗でいただくことも多いです。

あ、今週末はマラソン大会の後、近所の酒屋さんで新酒の試飲会だ!楽しみだなぁ。

さて、だいぶ話がそれましたが、忙しくて息する暇もない間に着々とBlogのネタを蓄積・・・とも思った気がします。その当時は。。。

それが今はすっぽり抜け落ちております。。。

という訳で、先日実行した懐かしいものを取り上げてみようと思います。

忘れ去られた遺跡、ロストロギアを掘り起こしてみる

懐かしのVBA、エクセルのマクロです。

読者の皆様もExcelが1995年頃から事務仕事の代名詞になるにつれ、扱ったことがある方も少なくないでしょう。私もそんな一人です。考えてみたら1997年に使い始め、VBAを使い始めたのは1999年のことだったかと思います。

さて先日、私がとあるプロジェクトで大失敗してしまい、あるデータをお客様に毎日送付することでお客様の業務をカバーしなければならない事態が発生しました。

そのデータはエクセルでいくつかのファイルに分けて送らなければならないのですが、セルに入っている値をファイル名として、同じ値の行を一つのCSVファイルに出力することにして、その処理をマクロで実行することにしました。当然ながらその処理を人が実施しようとすると、セルの値をクリップボードにコピーし、フィルタでセルの値を絞り込み、名前をつけて保存して、もう一度別のセルを・・・という作業を気が遠くなるほどの回数繰り返さなければなりません。

ソースコード

で、作成したのが以下のマクロです。

Sub Macro1()
Dim Line As Integer
Line = 3
Do While Cells(Line, 1).Value > 0
Dim FileSize As Long
intFNo = FreeFile '使用可能なファイル番号を取得
strCSVFilePath = "d:\data\" + Cells(Line, 1) + ".csv"
Open strCSVFilePath For Append As #intFNo 'フルパスを指定してCSVファイルをオープン
FileSize = FileLen(strCSVFilePath)
If FileSize = 0 Then 'ファイルが0バイト=一行目の場合にはタイトルを挿入
Write #intFNo, Cells(1, 3), Cells(1, 4), Cells(1, 5), Cells(1, 7), Cells(1, 9)
End If
Write #intFNo, Cells(Line, 3), Cells(Line, 4), Cells(Line, 5), Cells(Line, 7), Cells(Line, 9)
Close #intFNo 'CSVファイルをクローズ
Line = Line + 1
Loop
End Sub

内容としてはA列をファイル名として、C、D、E、G列をCSVに書き出すというものです。

スタートは4行目からで、一行ずつひたすら処理を行い、A列のデータが空だったら終了します。
マクロを登録したボタンを押したら、1秒くらいで複数のファイルをババッ!と目にも止まらぬ速さで作成してくれました!

こんなに簡単なプログラムなのに、ファイルのオープンから出力ができるし、文字コードや改行コードも気にしなくてもいいという手軽さもまた新鮮です。

Linux上でgrepやawkなどを駆使してある程度の整形処理は可能になりますが、CSVファイルを作るという単純作業はマクロにやらせるのが“吉”ですね!

  • このエントリーをはてなブックマークに追加
  • Pocket
  • LINEで送る

SNSでもご購読できます。