では前回行ったCSVファイルの読み込みを関数化してCSVの扱いを楽にしていきましょう。
CSVを取り込む順序を考える
まずは順序を考えましょう。
僕が前回行った手順では
- ファイルを選択するダイアログを出す。
- ファイルのパス(おいてある場所)からCSVを読み込む
ですね。この場合1と2は全く別の処理ですので分けて関数化してみましょう。
ファイル選択ダイアログを出す関数作成
これは簡単ですね。
Functionを作成してファイル選択ダイアログの為の
Application.GetOpenFilename("CSV Files (*.csv), *.csv")
の結果を関数の戻り値として設定するだけですね。
Function filePath() As String
Dim s As String
s = Application.GetOpenFilename("CSV Files (*.csv), *.csv")
If InStr(s, "csv") = 0 Then
MsgBox "CSVファイルが見つかりませんでした。"
Exit Function
End If
filePath = s
End Function
もしもキャンセルが押された時やCSVファイルではないものを選択されてしまった時の為に念の為メッセージを出しておきます。
使用する時は
Dim s As String s = filePath
の様にすれば変数sに選択したファイルのパスが格納されますね。
CSVを取り込む関数作成
この関数は引数にファイルのパスを受け取って発動させましょう。
ひとまずは取り込みだけなのでCSVファイルの行ごとのデータを1次元の配列として呼び出し元に返す様にしていきます。
Function csvArr(s As String) As Variant() Dim i As Long Dim arr() As Variant 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 csvArr = arr() End Function
関数の戻り値として返す型に()を加える事により配列と返すという事にします。(つけなくても出来ちゃいますが…)
基本的な処理は前回行ったものと概ね変わりません。ただ、関数の戻り値として返すものの設定がいつもとちょっと違うだけですね。
まとめ
これでCSVの読み込みを関数化出来ましたので沢山CSVを読み込む時でも
Dim s As String Dim arr As Variant
s = filePath arr = csvArr(s)
こんな感じで終わっちゃいますね。
では次回は実際にこれら取り込んだデータをセルに吐き出すとしてのお話をしていこうかと思います。