初心者のためのExcel エクセルマクロVBA入門-実践:CSVファイルの読み込み(取り込み)その2
実践!エクセルマクロでCSV読み込み
前回はCSVには本当にいろいろなものがあるということは理解してもらえたと思います。では、いよいよ、CSVの読み込みを実践していきましょう。一番簡単なのは前回でやったパターン1です。
1,山田,太郎,東京 2,鈴木,二郎,大阪 3,田中,,名古屋
このパターンを読み込むエクセルマクロをVBAで作ってみたいと思います。
ファイルを開いて、1行ずつ読み込む
ファイル読み込みの基本は、ファイルを開いて、開いたファイルを1行ずつ読みこんで、エクセルのセルに出力するなり、変数や配列に取り込んでマクロの内部、つまりプログラムのなかで加工して出力するなりします。
とりあえず、途中まではいつも通りやってみますか?最初と最後書いて・・・
' CSVファイルを読み込んでセルに表示する Sub ReadCsvCell(ByVal strFilePath As String) End Sub
今回はちゃんと名前を付けます。ReadCsvCellという名前で引数にString型のstrFilePathを持つという意味ですね。つまりこのプロシージャは開きたいファイルのパスを引数に渡してあげれば、そのCSVファイルを読み込んでセルに表示してくれるプロシージャということになります。さて、後は日本語で書いて・・・
' CSVファイルを読み込んでセルに表示する Sub ReadCsvCell(ByVal strFilePath As String) ' strFilePathで指定されたファイルを開いて ' 一行読み込んで・・・ ' あれ?つぎどうしよ? End Sub
ファイルは一行を読み込むと一行全体を文字列として取り込みます。先ほどのパターン1のCSVファイルなら「1,山田,太郎,東京」が文字列として取り込まれるわけですね。さて、どうしましょう?今度はこれをカンマで分割すればよいのです。VBAにはSplitという関数があり、これを使ってカンマで分割して配列に取り込みます。
' CSVファイルを読み込んでセルに表示する Sub ReadCsvCell(ByVal strFilePath As String) ' strFilePathで指定されたファイルを開いて ' 一行読み込んで・・・ ' カンマで分割して配列に格納して ' セルに表示する End Sub
これで1行の取込ができました。ですが、CSVは複数行なのでこれを繰り返す必要があります。つまり・・・
' CSVファイルを読み込んでセルに表示する Sub ReadCsvCell(ByVal strFilePath As String) ' strFilePathで指定されたファイルを開いて ' 開いたファイルの行数分繰り返し ' 一行読み込んで・・・ ' カンマで分割して配列に格納して ' セルに表示する ' 繰り返し終了 End Sub
ということになります。後はこの日本語をVBAに翻訳し必要な変数を宣言して使えばよいのです。
' CSVファイルを読み込んでセルに表示する Sub ReadCsvCell(ByVal strFilePath As String) Dim intFF As Integer ' FreeFile値 Dim strLine As String Dim vntREC As Variant Dim cnt As Long cnt = 1 ' ファイル番号を取得する intFF = FreeFile ' strFilePathで指定されたファイルを開いて Open strFilePath For Input As #intFF ' 開いたファイルの行数分繰り返し Do Until EOF(intFF) ' 一行読み込んで・・・ Line Input #intFF, strLine ' カンマで分割して配列に格納して vntREC = Split(strLine, ",") ' セルに表示する Sheet1.Range(Sheet1.Cells(cnt, 1), Sheet1.Cells(cnt, UBound(vntREC) + 1)) = vntREC ' 出力行カウンタを1上げる cnt = cnt + 1 ' 繰り返し終了 Loop ' ファイルを閉じる Close #intFF End Sub
これで完成です。一応パターン1のCSVならこれで読み込むことができます。とりあえず実行したい場合は、Openメソッドの引数strFilePathを実際のCSVのファイルパスに書き換えて使いましょう。
Open strFilePath For Input As #intFF
を
Open "C:\ExcelVBA\Sample.csv" For Input As #intFF
のような感じです。さて、いくつかあるので、説明ですね。
ファイルを開くOpenメソッド
Open strFilePath For Input As #intFF
Openメソッドを使うとファイルを開くことができます。ファイルパスは絶対パス、または相対パスで指定します。また、同時にファイル番号を指定します。ファイル番号は#intFFで、最初にintFF = FreeFileで現在使うことができるファイル番号を設定しています。VBAでは基本的にファイルを番号で管理しています。最初に開いているファイルが1番目、次が2番目・・・みたいな感じです。なのでファイルを開く場合には同じように番号を付けてあげる必要があります。しかし、番号がかぶってはいけない。そこでFreeFileを使うことで今開いている番号を自動で取得できるのです。
For Inputは入力モードで、という意味になります。つまり読み込みで開きますよーという意味です。
一行読み込むLine Input
Line Input #intFF, strLine
これを使うと該当のファイル番号。つまり開いたファイルの1行目を読み込みます。読み込んだ後に文字列型の変数strLineに格納してくれるのです。
配列が何個かわからないからとりあえずVariant
今回、配列の宣言はVariantで行っています。理由は・・・
- とりあえず配列にしたいけど、どんなデータを格納するかわからない。
- いくつあるかもわからない
という理由でVariantで宣言しているのです。最初から()を付けて
Dim vntREC() As Variant
としてしまうと、今度は個数を一旦再宣言しなければいけません。ReDimでしたね。しかし、今Split関数を使って配列に取り込むため、何個の配列になるのかわからないまま、いっぺんに取り込む必要があるのです。したがって、一旦Variantで宣言してしまいます。
配列をセルにまとめて表示する
Sheet1.Range(Sheet1.Cells(cnt, 1), Sheet1.Cells(cnt, UBound(vntREC) + 1)) = vntREC
ちょっと長いですが、惑わされないでくださいね。いつものRange(Cells,Cellls)の形です。これは、セルの1列目から、取り込んだ配列の個数分の間に配列を代入して出力しています。こうするとセル1つ1つに配列の1つ1つが対応して出力されます。cntは行用のカウンタです。最初に1が代入されているので、1行1列目から1行配列の個数列分までとなります。
最後の行まで繰り返す!
Do Until EOF(intFF) ~ Loop
直近のDo ~ Loopまでやりましたね。これはUntil付きの条件文です。EOF(intFF)がポイントですね。EOFは指定したファイル番号のファイルが最後かどうか?を判定してくれます。最後になれば、この繰り返しは終了します。EOFとは「End Of File」の略で、ファイルカーソルの最後を表します。ちょっととしたメモ帳ではなくテキストエディタを使っている人なら、見たことがあるはずです。このEOFを判定してくれるのがEOF(intFF)になります。
以上で、パターン1のCSVはとりあえず読み込むことができました。さて・・・どうでしょう。じゃあパターン2ならどうなんですかね?パターン3なら?改行含めたらどうなんの?なんてことがあり、それぞれで対応を施して行きながら、このマクロの種を進化させていきましょう。
とりあえず、今日はここまで!
かしこ
お勧めはこのあたり。
かんたんプログラミング Excel 2010 VBA 基礎編
- 作者: 大村あつし
- 出版社/メーカー: 技術評論社
- 発売日: 2011/10/21
- メディア: 大型本
- 購入: 1人 クリック: 1回
- この商品を含むブログを見る
Excel VBAのプログラミングのツボとコツがゼッタイにわかる本―最初からそう教えてくれればいいのに!Excel2007/2003対応
- 作者: 立山秀利
- 出版社/メーカー: 秀和システム
- 発売日: 2007/10/23
- メディア: 単行本
- 購入: 23人 クリック: 470回
- この商品を含むブログ (20件) を見る
続ExcelVBAのプログラミングのツボとコツがゼッタイにわかる本―最初からそう教えてくれればいいのに!
- 作者: 立山秀利
- 出版社/メーカー: 秀和システム
- 発売日: 2009/12/17
- メディア: 単行本
- 購入: 3人 クリック: 13回
- この商品を含むブログ (3件) を見る