ここまではユーザーフォーム多めでブログを書いてきましたが今回はちょっと趣向を変えてCSVの読み込みを行ってみましょう。
CSVとは
CSVとは拡張子が「.csv」のファイルですね。あらゆる業界で使用されているExcelと互換性のあるテキストファイルなのですが、Excelと互換性があるが故に「.csv」の拡張子のファイルのアイコンがExcelのアイコンになってしまったり指定しなければExcelで開いちゃったりするのでExcelのなんか違うバージョンと思われている方もいらっしゃいます。
しかし、中身はカンマと改行で区切られたテキストファイルです。
テキストファイルなので普通にExcelファイルを扱う時とはちょっと違うので困惑してしまう事もあるかと思います。
CSVファイルを読み込む準備
ではCSVファイルを読み込む準備をしましょう。
Excelはそもそもの機能で「データ」タブの「データの取得と変換」にある「テキストまたはCSVから」という項目の選択でCSVファイルの読み込みができますが僕のブログはあくまでもExcelVBAのお勉強という事でVBAで読み込んでいきます。
CSVファイルはフラッシュメモリなどから読み込む場合が多いかと思いますのでファイル名を指定するのではなくファイルを直接指定する方が実用的かと思います。
まずはファイルを選択するダイアログを出します。
Application.GetOpenFilenameを使用します。引数はちょっとややこしいので割愛しますが下記の様にすればダイアログの右下あたりにあるファイル形式の指定が「CSV Files(*.csv)」の状態でファイル選択ダイアログが開きます。
Application.GetOpenFilename("CSV Files (*.csv), *.csv")
CSVファイルの場所を変数に格納
では先程のプログラムから開いたものを適当に変数を作って代入しましょう。そうする事によりダイアログから選択されたファイルのパス(場所)が変数に格納されます。
Sub csv_test()
Dim s As String
s = Application.GetOpenFilename("CSV Files (*.csv), *.csv")
End Sub
CSVの読み込み
では実際に読み込んでみましょう。
CSVファイルの扱いにはいくつか方法があるようですが僕がいつも使っている手法はこちらです。
Open s For Input As #1
ここにある「s」は先程ダイアログを開いて指定したCSVファイルの場所です。
このCSVファイルをOpen(開きます)ってことですね。
For Inputは取り込みますって事です。
As #1はファイル1個だけって事です。
つまり指定した場所にあるCSVファイルを1個だけ取り込みますよーって事ですね。
ではこれを1行ずつ読み込んでイミディエイトウィンドウに吐き出していきましょう。
この際CSVファイルの一番下の行まで読み込んだら終了させる為にDoを使用していきます。
終了条件は「一番下の行まで」達した時ですね。という事でUntilを使用します。
ファイルの終端という意味でEOF(1)を終了条件にします。
EOF(1)はEnd Of Fileの略でファイルの終端の事です。(1)はファイルの番号の事です。つまり先程指定した#1の事です。
Sub csv_test()
Dim s As String
Dim a As String
s = Application.GetOpenFilename("CSV Files (*.csv), *.csv")
Open s For Input As #1
Do Until EOF(1)
Line Input #1, a
Debug.Print a
Loop
Close #1
End Sub
この様に文字列を格納する変数を作ってその変数に1行ずつ入れていきます。
変数に1行ずつ格納する為にはLine Input #1, aの様にします。
Line Inputは行の取り込みですね。#1は先程指定したファイルの番号、aは取り込んだ行(文字列)を格納する為の変数です。
そして開いたCSVファイルは最後にCloseで閉じてあげましょう。
CSVのデータを配列に格納しましょう。
イミディエイトウィンドウに出すだけでは汎用性に欠けるので配列に格納していきましょう。
用意する変数は配列となる変数、そしてカウンタ変数ですね。
Sub csv_test()
Dim s As String
Dim arr() As String
Dim i As Long
s = Application.GetOpenFilename("CSV Files (*.csv), *.csv")
Open s For Input As #1
i = 0
ReDim arr(0)
Do Until EOF(1)
i = i + 1
ReDim Preserve arr(i)
Line Input #1, arr(i)
Loop
Close #1
End Sub
以上のプログラムを実行するとこの様になりました。
後はCSVファイルはカンマ区切りのテキストファイルである特性から考えてSplitしてあげれば簡単にデータを扱う事が出来そうですね。
Split?と思った方は Split関数 を見返して下さい。
まとめ
たったのこれだけでCSVファイルを読み込む事が出来ました。
ですがこの手順がちょっと面倒・・・な方の為に次回はこれを関数として扱える様にしていきたいと思います。