とりにくを好きな人がVBAを勉強しています。

VBAを中心に、その他日々の生活で感じていることを書いていきます。

【VBA】CSVのデータを取り込む方法について

おはようございます。こんにちは。こんばんは。
朝からお腹を下していて、午前中でもうトイレに7回ほどお世話になっているとりにくVBAです。


さて、最近仕事でCSVを取り込みたいなあと思ったときがありましたが、過去に勉強したことはあるものの、思い出すことができず、この週末で復習をしたので、その内容を紹介したいと思います。


参考図書


過去に勉強したことがあるというのは、こちらの本です。



Excelでカレンダーを作成する過程でVBAについて学ぶことができる一冊です。
デバッグの方法についても丁寧に書かれていて、イミディエイトウィンドウやローカルウィンドウなどを覚えたのはこの本でした。



祝日の判定をするときに、祝日データが入ったCSVを取り込む場面が出てきます。



今回はその復習をしました。
以前に読んだ時よりも自分の中でかみ砕いて一般化することができたので、仕事でも使えそうな気がしています。


コードを書いていこう


今回のCSVの読み込みについては、アイディアでどうこうというよりは、知っているかどうかなので、考え方とかではなく、コードを書いていったほうがいいと思います。



参考図書の例にならって、祝日のCSVファイルを読み込んでみようと思います。



祝日のCSVファイルは、内閣府のホームページで取得することができます。



www8.cao.go.jp



ExcelCSVファイルを開くとこんな感じです。


f:id:mayo032j:20200607140119p:plain


昭和30年から載ってます…



この祝日ファイルを読み込んで、イミディエイトウィンドウに表示するところまでをやってみます。


まず 開く


ファイルを開くために、Openステートメントというのがあるようです。

docs.microsoft.com



省略可能な部分を省いて、すっきりさせるとこんな感じになります。

Open  "パス"  For  モード  As  #  番号

ファイルのパスを指定して、選んだモードで開く。そしてそのファイルに番号をつける(1~511までの任意の整数)。といった感じです。
つけた番号は、このあとの処理に使うので、刑務所に入った人が番号で呼ばれるようになるイメージですね。(違うか…)




パスの指定については、Application.GetOpenFilenameメソッドを使うと楽です。
モードについては、input(シーケンシャル入力モード)を使用します。
とりあえず、inputを覚えておけば今回の目的は達成できそうだったので、その他のモードについてはあとで暇ができたら調べてみることにします。


Dim opFileName As String: opFileName = Application.GetOpenFilename


Open opFileName For Input As #1


とりあえずこれで指定したファイルを開くことができました。

開いたら閉じる


先ほどOpenステートメントを使用してファイルを開きました。


docs.microsoft.com


開いたら閉じましょう。


Closeステートメントを使います。

Dim opFileName As String: opFileName = Application.GetOpenFilename

Open opFileName For Input As #1

処理

Close #1

簡単ですね。開いたときにつけた番号を指定することができます。


データを取得する


さて、開いて閉じることができました。
これからデータを取得していきます。



これがまた思った以上に簡単で、こんな書き方をします。

Input #1, "変数"

これでデータが変数に格納されます。


開いて閉じるの間に、これを追加し、変数の値をイミディエイトウィンドウに表示してみましょう。

f:id:mayo032j:20200607141835p:plain


変数の値は、一番最初の「国民の祝日・休日月日」でしたね。

f:id:mayo032j:20200607140119p:plain


それ以降のデータを取得するには、同じことを繰り返してやります。
単純に3回同じことを繰り返してみましょう。


f:id:mayo032j:20200607142308p:plain


f:id:mayo032j:20200607142734p:plain


横に行って、1行目のデータがなくなったら2行目という感じに動きそうですね。



こんな感じで最後まで繰り返せばよいことになります。

最後まで繰り返す便利なやつ


CSVの中にデータがどれくらいあるかわかっていればよいのですが、いちいち数を把握するのは面倒です。



そこですごく便利な常套句があるようです。

Do Until EOF(番号)
 処理
Loop


こちらです。EOFはEnd of Fileの省略で、ファイルの最後のデータまで繰り返すときに便利なコードです。
かっこの中の番号には、Openステートメントで指定した番号をいれます。


合体


最後にこれまでのコードを全て組み合わせてみましょう。

Sub sample()

    Dim opFileName As String: opFileName = Application.GetOpenFilename
    Dim str As String
    
    Open opFileName For Input As #1
        Do Until EOF(1)
                
            Input #1, str
            Debug.Print str
                
        Loop
    Close #1

End Sub

結果はこちらです。


f:id:mayo032j:20200607164419p:plain



令和3年までのデータが入っていましたので、最後まで繰り返されていることがわかります。


おわりに

今回、CSVのデータをイミディエイトウィンドウに表示するところまでできました。
変数に格納することができているので、このあとはセルに代入するなり、データを加工するなり、いろいろなことができると思います。
ちなみに、参考図書では2次元配列に格納して祝日の判定をする流れになります。




仕事でつかえるかなあー。。。