EXCELでCSVファイルの入出力

 仕事上の必要(楽をしたいということだな)に迫られて、ECXELでCSVファイルを入出力するマクロを作ったのだが、ひょっとしたらこういう機能を欲しがっている人もごく一部にいるのではないかと思い、公開することにした。
 EXCEL97以降なら使えると思うが、他のバージョンに関しては動作の確認をしていない。
 EXCEL95って、マクロは共通だったっけ???。

 マクロ本体はここ→CSVIO.lzhからダウンロード。
 圧縮ファイルの中にこれと同じ内容のHTML(excelcsv.htm)ファイルが入っているので、電話代が気になる人は回線を切ってからゆっくりと読むとよいだろう。

CSVファイルって?

 Comma Separated Valueの略で、各値をカンマで区切ったデータ形式のこと。
 EXCELなどの表計算ソフト、データベースソフトなどでは独自のデータ形式をもっており、それぞれのデータ間では互換性がないのが普通である。
 それだとAというソフトで作ったデータをBのソフトで使おうとすると、最初から入力をしないといけないこととなる。
 そこで、世間一般の標準形式であるCSVファイルに変換しておくことで、データのやり取りが可能となる。
 ただし、ソフト固有の計算式等はなくなり、すべて文字列のデータとなってしまうのが難点ではある。

 実験のデータやコンピュータで作成された測定データなどにもCSVがよく使われる。
 この手のファイルをEXCELでお手軽に扱おうという魂胆である。

 CSVにも種類があり、文字列は " で括るというものもある。
 この場合、" で括られた数字は文字として扱われ、括られていないものは数値として扱われることとなる。
 今回のマクロは、" で括られていた場合は " をはずし、後はEXCELの判断に任せることとした。

EXCELではできないのか?

 EXCELでCSVファイルを読み込むことは可能である。
 ただし、新規にブックを開いて読み込むこととなり、現在のワークシートの任意の場所に読み込むためには新規ブックからコピー&ペーストする必要がある。
 複数のCSVデータを読み込んで一つの表にまとめるなどという作業をする場合、かなり不便である。
 ちなみに、DOSのころの LOTUS1-2-3 では問題なくできた。
 そもそも当時は同時に複数のワークシートを開くなんていう概念がなかったが。

 CSVファイルの書き出しであるが、EXCELではシート単位での書き出しは可能である。
 しかしながら、ワークシート内の任意の範囲のみを書き出すためには、いったんワークシートを編集し、必要な部分だけのワークシートにしてからテキスト形式(CSV)で保存しなければならない。
 これも結構不便な作業である。
 ただ、任意範囲のCSVファイルを書き出すという作業自体、必要性が高いとは思えないが(笑)。

まずは組み込み

 EXCELを起動し、メニューの「ツール」−「マクロ」−「Visual Basic Editor」でマクロ開発環境を起動する。
 左側にプロジェクトのウィンドウが出ていると思う。
 出ていない人は、メニューの表示からプロジェクトエクスプローラーを選択する。
 このマクロを現在のブックのみで使う場合は、一番上(多分)に表示されている現在のブックを選択しておく。
 (VBAProject(book1)とかいうやつ)
 どのブックを開いている時でも使いたい場合には、PERSONAL.XLSを選択しておく。
 (VBAProject(PERSONAL.XLS))
 PERSONAL.XLSがない場合には、まず、これを作成する。
 作成方法はPERSONAL.XLSの作り方を参照のこと。

 「ファイル」−「ファイルのインポート」でCSVIO.lzhを解凍してできたファイルの中からFrmOpenCsv.frmを選択し、組み込む。
 次に、同様にしてCSVIO.BASを組み込む。
 たったのこれだけで組み込みは終了。
 もうVisual Basic Editorを閉じてもよい。

使い方

CSVの入力


 EXCELのメニューから「ツール」−「マクロ」−「マクロ」でマクロ選択のダイアログが表示される。
 そこからCsvInsを選択し、実行ボタンをクリックする。


 区切り文字が","以外であった場合は右上にとってつけたようにある「区切り文字」にて所定の区切り文字を指定する。
 タブの場合は"\t"、半角スペースの場合は"\s"とする。とりあえず"###"とか"<>"なども指定できるはず。(こうなるともはやCSVではなくなるが、話の都合上CSVのまま進める)
 読み込むCSVファイルを選択する。
 読み込み先セルを指定する。右側の "_" の部分をクリックするとワークシートの画面になるので、そこで選択してもよい。
 読み込み先セルは、現在アクティブになっているセルになっているはずなので、マクロを起動する前に読み込み先セルを選んでおくという方法もある。

 CSVファイルを保存する際に、データ中の","を別の文字列に変換していた場合は、カンマ変換文字を変換していた文字列に指定しておく。

 あとは「開始」をOKをクリックするだけでCSVのデータがどんどんとセルを埋めていってくれる。
 ファイル名や読み込み先セルが指定されていないかったり、キャンセルで終了したりすると「指定が間違っています」というメッセージが出る。


 多少なりとも処理速度をあげるため、すべての入力が終わるまで画面の書き換えを行っていないが、ステータスバーに読み込んだ行数が表示(10行ごとの表示)されているので進行状況はなんとなくわかると思う。

CSVの出力

 CSV入力と同様にマクロ選択のダイアログを表示し、CsvOutを選択する。

 CsvInsと同じようなダイアログが表示されるので、出力先のCSVファイル名と出力範囲を指定する。
 マクロ起動前に範囲指定をしておくとその値がセットされるので、この方法のほうが使いやすいかもしれない。
 マクロ起動時に範囲を指定しなかった場合、自動的にデータの入っている範囲すべを矩形で括った範囲が指定される。データがない場合は範囲の選択のしようがないために実行時にエラーメッセージが表示される。
 また、範囲指定は範囲1つのみで、複数の範囲を指定することはできない。
 指定範囲内の空白セルも、省略されることなくデータなしでカンマが連続する形で出力される。

 データ中に区切り文字(通常はカンマ)が入っている場合、CSVファイルとして正しく処理できなくなる。
 その際には、「区切変換文字列」にデータ中に使用されていない適当な文字列("###"とか"<>"とか"ふじこ"とか)を指定しておくと、出力時に","をその文字に変換して出力する。

 「計算式出力」を指定した場合、セルにIF関数などのカンマで区切る関数が入っている場合は必ず必要となる。
 ただし、これはこのマクロの特例処置のため、他の人にこの形式のCSVファイルを渡す場合には注意が必要である。
 CSVファイルをEXCELで読み込んだあとにその文字列を区切り文字に置換してもらう必要がある。

 「計算式出力」にチェックを入れると計算式の入っているセルは計算式で出力される。
 この機能は、Excelの計算式を入力できるソフトでしか使えないので実質Excel専用とも言えるが、罫線なしでコピーしたい場合などは有効かもしれない。
 しかし、Excel内でのコピーと異なり、計算式が参照しているセルを相対的に変更してくれないので、やはり用途はかなり限られるだろう。(形式を指定してコピーのほうが簡単である)

 OKをクリックすると出力を開始するが、既に同じ名前のファイルが存在していた場合は、上書きするかそのファイルの後ろにデータを追加するか、キャンセルするかが選べる。

注意点

 マクロにプロテクトなどをかけていないので、(というか、ソースそのものだし)初めてマクロをいじる人の参考とか、自分の使い道に合わせて改造するとか、好きなようにして使うといい。
 ただし、私自身もマクロ初心者なので変な作り方をしているかもしれないが、「目的が達成できればOK」の精神でやっているので、余計な突っ込みは勘弁してほしい(笑)。
 マクロ内部に動作確認用の命令がコメントとして残っているが、気にしないように。
 「こうするといいよ」みたいなアドバイスはとっても歓迎する。

変更履歴

2001年4月ごろ
 作成
2003年6月ごろ
 つまらないバグを直した
2003年7月ごろ
 計算式出力とカンマ変換機能を追加
2006年2月23日
 区切り文字にTABと半角空白を使えるようにした。
 CSV出力時、範囲指定がなかった場合は範囲を自動で選択するようにした。
 区切り文字に文字列を使えるように修正した。
2006年2月25日
 CSV入力時に余計なメッセージが出ていたのを修正。

表紙へ