CSVファイルをExcel VBAで扱う(1)新規作成したCSVファイルに内容を書き込みする

Excel マクロ、VBA

スポンサーリンク

はじめに:CSVファイルの扱いについて

CSVファイルというものは、普通はExcelでダブルクリックすれば開けるファイルだ。
しかし実際は、CSVファイルはExcelファイルの仲間ではなく、テキストファイルという文字情報だけのファイルだ。

そしてCSVファイルは、デフォルトではExcelで開くようになってるけど、だからといって原則的にExcelでデータ編集してはいけない

例えば「0001」というデータなら、Excelがそれを数字と判断して、先頭の0の文字が消えて「1」に変化してしまうといったことになるからだ。
編集するならExcelでじゃなく、メモ帳などのテキストエディタというやつで編集しないといけない。

「CSVファイル」について語る~ExcelファイルとCSVとは無関係~

・・・とここまでは、ちょっと勉強した人なら知ってることだし、必ず知らないといけないことだ。
しかしそんなこと言われても、テキストエディタでCSVファイルを編集するって、かなり面倒なことだ。

CSVファイルというのはカンマ文字「 , 」で列ごとに区切られたファイルだけど、例えばその5列目が会社名の列だったとして、5列目=会社名の末尾全てに「株式会社」と追加したいということになったらどうか。

Excelでなら5列目だけを一気に選ぶなんて簡単だけど、テキストエディタでは中々そうは行かないので難しい。

最近のテキストエディタには、CSVファイル編集用の専用モードなんてのが付いているものがあるけど、基本的に有料のものが多い。
ただ、私の愛用の無料テキストエディタ「サクラエディタ」には、バージョン2.3以降でCSVファイル編集モードが追加されたので、これは使ってみると良いだろう。

その設定方法等について、別記事に書いた。

「サクラエディタ」でCSVモードを使ってCSVファイルを編集しよう

しかしながら、ちょっと複雑な編集になってくるとやはり、テキストエディタでは難しい点が多い。

「CSVファイル」について② CSVをExcel形式で使う場合の方法など

そうなるとExcel VBAでやることになるのだけど、Excel VBAではCSVファイルなどテキストファイルを扱う専用の方法がある。
今回はそれを書いていく。

Excel VBAでテキストファイルを扱う:読み取り・書き込みの構文

テキストファイルを読み取り用に開くか書き込み用で開くか

Excel VBAでテキストファイルを扱うときは、まずテキストファイルのファイル名(フルパス)を取得する。
そのファイル名を myTextFile とすると、テキストファイルを読み取り用に開くか書き込み用で開くかで、次のように分かれる。

Open myTextFile For <開き方> As #1


というわけで、<開き方>の部分を書き換える以外は全て共通だ。

そして<開き方>については、ソースコードのコメントにも書いたが、次のようになる。

開き方内容内容を変数varに読み込む/書き込む
Inputテキストファイルを読み取り用に開くLine Input #1, var
Outputテキストファイルを白紙にして0から新規書き込みするPrint #1, var
Appendテキストファイルの内容の最後から、追加で書き込みする

正確に言うとこの3つ以外にもRandomとかいうのもあるけど、使うことはほぼ無いはずなので省略する。

「内容を変数varに読み込む/書き込む」というのも表に入れたが、これについては実際のソースコードで見ることにする。

空き番号の取得

Open myTextFile For <開き方> As #1

最後に#1とあるがこれは、使用するファイルについて空いている(使用できる)番号を取得しますよ、というものだ。

空いてる番号って何のことやらだけど、正確に言うとFreeFileというものを使って、利用許可が下りる空き番号を正しく取得することになる。

ただ普通は、番号が空くも何も、ファイルを他に同時に使うことはそう無いはずなので、番号として1を毎回使えば良い。
つまり決り文句として「#1」を毎回使えば良い。一応後で、読み込み用と書き込み用で#1・#2を両方使う例を書くけどね。

サンプルソースコード:セルの値を新規CSVファイルに書き込む

Outputを使って新規書き込みするソースコード

さてCSVファイルの扱いということで、

  • 既存のCSVファイルや新しく作ったCSVファイルに、内容を書き込んで保存する
  • 既存のCSVファイルを開いて読み込み、その内容を処理する

といったものが考えられるが、まずは自分で新しくCSVファイルを作成して、そこに内容を書き込む例を扱ってみる。

新規書き込みなので、上記に示したOutputを使うことになる。
テキストファイルの内容を読み込むInputを使うソースコードは、次回以降取り上げる。

CSVファイルをExcel VBAで扱う(2)CSVファイルの内容を読み込んで処理する

次のソースコードは、ExcelのシートのA1:E10セルの値を、新規作成したCSVファイルに書き込むマクロだ。

解説

さて、まず

myCSVFile = ThisWorkbook.Path & “\新規” & Format(Now, “yyyymmddhhmmss”) & “.csv”
という箇所で、現在時刻を秒単位まで取得したファイル名のCSVファイルを扱っている。

そんな現在時刻の名前のCSVファイルなんて、よほど事前に作成しない限り存在しないはずだが、問題はない。その次の

Open myCSVFile For Output As #1
で、テキストファイルが存在しないのなら新規作成してくれる

arrというもの(配列)にセルの値を格納してから代入しているが、詳説は省くけどれはセルの値を高速処理するためのテクだ。

そしてbufという文字列変数に、セルの値をカンマ区切りで代入し、最後に一気に

Print #1, buf
でCSVファイルに書き込んでいる。

この

Print #1, buf
というやつは、テキストファイルに内容を1行ずつ書き込んでいく定型の処理だ。

たとえば
Print #1, “abcd”
と書いた場合、「abcd」という文字列を1行書き込むことになるけど、引き続き
Print #1, “wxyz”
と書けば、次の行に続けて「wxyz」と1行書き込むことになる。つまり

Print #1, “abcd”
Print #1, “wxyz”
という2行のコードを書けば、
abcd
wxyz
という2行の文字が書き込まれることになる。

処理の終わりには

Close #1
でテキストファイルを閉じておくことも忘れないようにしよう。
これをしないと、書き込んだテキストファイルを開くとき、使用中になっていたりしかねない。

さて今回は、Outputを使ってテキストファイルに新規書き込みする例を扱った。
CSVファイルとして作ったが、拡張子を「.txt」にすれば単なるテキストファイルとして作ることは勿論可能だ。

次回は、Inputによる読み取りを行い、それを他の操作と組み合わせたマクロを紹介してみる。

スポンサーリンク