スポンサーリンク
はじめに:CSVファイルの扱いについて
CSVファイルというものは、普通はExcelでダブルクリックすれば開けるファイルだ。
しかし実際は、CSVファイルはExcelファイルの仲間ではなく、テキストファイルという文字情報だけのファイルだ。
そしてCSVファイルは、デフォルトではExcelで開くようになってるけど、だからといって原則的にExcelでデータ編集してはいけない。
例えば「0001」というデータなら、Excelがそれを数字と判断して、先頭の0の文字が消えて「1」に変化してしまうといったことになるからだ。
編集するならExcelでじゃなく、メモ帳などのテキストエディタというやつで編集しないといけない。
・・・とここまでは、ちょっと勉強した人なら知ってることだし、必ず知らないといけないことだ。
しかしそんなこと言われても、テキストエディタでCSVファイルを編集するって、かなり面倒なことだ。
CSVファイルというのはカンマ文字「 , 」で列ごとに区切られたファイルだけど、例えばその5列目が会社名の列だったとして、5列目=会社名の末尾全てに「株式会社」と追加したいということになったらどうか。
Excelでなら5列目だけを一気に選ぶなんて簡単だけど、テキストエディタでは中々そうは行かないので難しい。
最近のテキストエディタには、CSVファイル編集用の専用モードなんてのが付いているものがあるけど、基本的に有料のものが多い。
ただ、私の愛用の無料テキストエディタ「サクラエディタ」には、バージョン2.3以降でCSVファイル編集モードが追加されたので、これは使ってみると良いだろう。
その設定方法等について、別記事に書いた。
しかしながら、ちょっと複雑な編集になってくるとやはり、テキストエディタでは難しい点が多い。
そうなるとExcel VBAでやることになるのだけど、Excel VBAではCSVファイルなどテキストファイルを扱う専用の方法がある。
今回はそれを書いていく。
Excel VBAでテキストファイルを扱う:読み取り・書き込みの構文
テキストファイルを読み取り用に開くか書き込み用で開くか
Excel VBAでテキストファイルを扱うときは、まずテキストファイルのファイル名(フルパス)を取得する。
そのファイル名を myTextFile とすると、テキストファイルを読み取り用に開くか書き込み用で開くかで、次のように分かれる。
1 2 3 4 5 6 7 8 9 |
'読み取り用に開く Open myTextFile For Input As #1 '新規書き込み用に開く Open myTextFile For Output As #1 '追加書き込み用に開く Open myTextFile For Append As #1 '最後に、処理が終わったらテキストファイルを閉じよう Close #1 |
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を使うソースコードは、次回以降取り上げる。
次のソースコードは、ExcelのシートのA1:E10セルの値を、新規作成したCSVファイルに書き込むマクロだ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
Sub outputCSV() '*****A1:E10セルの値を、新規作成したCSVファイルに書き込むマクロ***** Dim myCSVFile As String 'ファイル名に現在時刻を入れたCSVファイルを、Excelブックと同じ場所に新規作成 myCSVFile = ThisWorkbook.Path & "\新規" & Format(Now, "yyyymmddhhmmss") & ".csv" '新規作成したCSVファイルを開く Open myCSVFile For Output As #1 Dim arr As Variant Dim buf As String Dim r As Long Dim c As Long 'A1:E10セルの値を配列へ arr = Cells(1, 1).Resize(10, 5).Value For r = 1 To 10 For c = 1 To 5 '配列の値をカンマ区切りで格納 buf = buf & arr(r, c) & "," Next c '最後に余分なカンマ文字が1つあるので削除 buf = Left(buf, Len(buf) - 1) 'Print #1で、CSVファイルに書き込み Print #1, buf buf = "" 'リセット Next r Close #1 'CSVファイルを閉じる End Sub |
解説
さて、まず
そんな現在時刻の名前のCSVファイルなんて、よほど事前に作成しない限り存在しないはずだが、問題はない。その次の
arrというもの(配列)にセルの値を格納してから代入しているが、詳説は省くけどれはセルの値を高速処理するためのテクだ。
そしてbufという文字列変数に、セルの値をカンマ区切りで代入し、最後に一気に
この
たとえば
Print #1, “abcd”
と書いた場合、「abcd」という文字列を1行書き込むことになるけど、引き続き
Print #1, “wxyz”
と書けば、次の行に続けて「wxyz」と1行書き込むことになる。つまり
Print #1, “wxyz”
wxyz
処理の終わりには
これをしないと、書き込んだテキストファイルを開くとき、使用中になっていたりしかねない。
さて今回は、Outputを使ってテキストファイルに新規書き込みする例を扱った。
CSVファイルとして作ったが、拡張子を「.txt」にすれば単なるテキストファイルとして作ることは勿論可能だ。
次回は、Inputによる読み取りを行い、それを他の操作と組み合わせたマクロを紹介してみる。
スポンサーリンク