みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
エクセルVBAでCSVファイルを取り込む方法シリーズです。
前回はこちらの記事でした。
CSVファイルの内容を1行ずつ取り込んでデバッグプリントする方法を解説しました。
ただ、実際にエクセルで取り扱う場合は、この一行ずつの文字列をカンマで区切って表形式にする必要がありますよね。
今回は、Splitという命令を使ってCSVから取り込んだ一行ずつ取り込んだ文字列をカンマで区切ってワークシートに転記をする方法です。
では、いってみましょう!
前回のおさらい:CSVファイルを一行ずつ読み取るシンプルなプログラム
まず前回のおさらいですが、プログラムはコチラでした。
[vb]
‘CSVファイルの取り込み 一行ずつ取得してDebug.Printをする
Sub openCSV()
Dim strPath As String
strPath = “C:\Users\Noriaki\Dropbox\40_ブログ\vba-csv\test\ラーメン店アンケート.csv”
Open strPath For Input As #1 ‘csvファイルをオープン
Dim i As Long
Dim strLine As String
Do Until EOF(1)
Line Input #1, strLine
Debug.Print strLine
Loop
Close #1
End Sub
[/vb]
文字列型のstrLineという変数に、CSVから一行ずつ読み取ってきてイミディエイトウィンドウに出力するという内容です。
プログラム自体はそれほど長くはないですが、Open,Close,Do Until EOF(1),Line Inputなど他ではあまり見ない命令がけっこう出てきていますので、前回記事をご覧いただいてよく復習いただければと思います。
実行結果としてはこのようにCSVのレコードが一行ずつイミディエイトウィンドウに出力されます。
CSVファイルからのデータをSplitで区切ってシートに転記する
先に今回のプログラムを書いちゃいますね。
[vb]
Sub getCSV()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)
Dim strPath As String
strPath = “C:\Users\Noriaki\Dropbox\40_ブログ\vba-csv\test\ラーメン店アンケート.csv”
Dim i As Long, j As Long
Dim strLine As String
Dim arrLine As Variant ‘カンマでsplitして格納
Open strPath For Input As #1 ‘csvファイルをオープン
i = 1
Do Until EOF(1)
Line Input #1, strLine
arrLine = Split(strLine, “,”) ‘strLineをカンマで区切りarrLineに格納
For j = 0 To UBound(arrLine)
ws.Cells(i, j + 1).Value = arrLine(j)
Next j
i = i + 1
Loop
Close #1
End Sub
[/vb]
今回のプログラムのメイン部分の流れは以下のようになります。
- CSVのレコードを1行ずつ文字列strLineとして取り込む
- 文字列strLineをカンマで分割して、分割した要素を配列arrLineに格納
- 配列arrLineに格納されている要素を一つ一つセルに書き込む
という流れです。
配列という非エンジニアの天敵ともいえる概念が出てくるのですが、その考え方を理解するために、図も用意しました。
この図をもとに一つ一つ解説をしていきます。
Splitで文字列をカンマで分割する
この例では、変数strLineに「1,しょうゆ,680,食べログ,4,…」といったCSVのレコードが文字列として格納をされています。
ここで今回の主役Splitです。Splitは文字列を特定の区切り文字で分割して、配列変数に格納する命令で、このように書きます。
配列変数=Split(文字列, 区切り文字)
今回は、上記のプログラムの20行目で
[vb]
arrLine = Split(strLine, “,”) ‘strLineをカンマで区切りarrLineに格納
[/vb]
として、strLineをカンマで分割してarrLineという配列に格納をしています。
配列とは何か、また配列の宣言について
変数は値を入れる「箱」に例えることができます。
配列はその「箱」が順番に複数並んだものとご理解いただければよいと思います。
上記の図でいうと、SplitでstrLineがカンマ区切りで12個の要素に分割されます。
さらに、arrLineという名前の0番から11番まで採番されている箱が用意され、そこに分割した要素が切り出した順番に格納をされるというわけです。
Split…なかなか高機能ですよね。
さて、この配列ですが、他の変数と同様に変数宣言をしておく必要があります。
プログラムでいうと12行目ですが
[vb]
Dim arrLine As Variant ‘カンマでsplitして格納
[/vb]
この部分です。
ここで、Variantという初めて見る変数型が出てきていますね。
Variantというのは、いわば「なんでも型」で様々なデータ型を取り扱うことができます。
なんだそりゃ?という感じですが、配列の宣言のときはVariant型で宣言をしておく、と覚えておいて頂ければひとまずはOKです。
配列の中身をセルに書き込む
お伝えした通り、配列arrLineには0番から11番までの番号が振られていますので、カウント変数を用意すれば、For~Next文で繰り返し処理をすることができます。
[vb]
For j = 0 To 11
ws.Cells(i, j + 1).Value = arrLine(j)
Next j
[/vb]
例えばこのような形にすることで、i行目の1列目(A列)から12列目(L列)まで、arrLineの配列の中身をセルに書き込んでいくことができます。
しかし、この「For j=0 To 11」でいうjの最終値をUBound(arrLine)としておくと便利です。
UBound(配列)
と書きますが、UBoundは指定した配列の最後の番号を取得することができます。今回の最後の箱は11番でしたから、11という整数が取得可能です。
CSV取込みの際は、Splitでいくつの要素に分割されるかがわからない場合もありますので、そのような場合はUBoundを使うと便利です。
実行結果
実行結果はこちらです。
無事にCSVデータがワークシートに転記されていますね。
まとめ
以上、CSVデータをカンマ区切りでワークシートに転記をする方法についてお伝えしました。
Splitはとっても便利な命令です。カンマだけでなく、他の記号や改行でも分割することができます。
配列はプログラムになじみのない方だと少し理解が難しいかもしれませんが、今回解説したように箱がいっぱい並んでいるものというイメージで頂ければと思います。
さて、CSVですが実はいくつかのパターンがありまして、今回のプログラムではうまくワークシートに取り込めないケースが出てきます。
そのようなパターンとその解決法についてお伝えできればと思います。
次回は改行コードがLFで作成されていて改行がうまくされないパターンについてです。
どうぞお楽しみに!