BizFAQ-ビズファックBizFAQ-ビズファック仕事・ビジネスにおけるちょっと困ったこと、わからないことをズバリ解決お悩み解決サイトです。Gen最初からやる気をそいでしまいますが、「CSVはVBAを使わなくてもエクセルで読み込めます!」しかしCSVにもいろいろなタイプの物があります。標準の機能で読み込むことが出来ないCSVもたくさん存在します。マクロはあなたの書き方によって柔軟さを使い分けることが出来ます。決まったことを決まったようにさせるマクロも書けますし、状況に応じた挙動をさせることも出来ます。区切り対象文字列です。置換対象の文字列です。置き換える文字列です。String型VBAで柔軟なCSV読み込みまず標準の機能を呼び出すマクロを書きます。その後CSVの読み込みに柔軟さを加えながらVBAで記述していきます。1.CSVを用意しますこれをsample.csvとしてCドライブのルートに保存します。Inputステートメントを用います。Inputを使ったほうが簡潔に読み込みできます。今回使用したファイルはこちらになります。Inputステートメントがあります。<>のところにはFreeFile()関数で得られた値を入れることになっています。正の数なら大丈夫なので中には「#1」と男らしく書いている場合もありますが、エラーのもとになるのでやめましょう。<>にはString型の変数を指定します。することで一行単位でテキストファイルの読み込みができます。最後にワークシートに読み込んだ結果を出力しています。読み込みの終了条件はテキストファイルの最後まで読み込みが完了した時。Until制御文とEOF(<>)関数で制御しています。Until制御文でキャッチする形になっています。次はVBAで得られた文字列を整形していきましょう。3.CSVを表データに直して読み込みをするCSVは次のような形になっています。このデータを読み込みましょう。」で区切られている状態です。いった時のために用意してあるのがSplit()関数です。区切り対象文字列です。注意点としてSplit関数は配列を返します。配列を返す関数はVariant型の変数で受け取るのがルールになっています。修正したマクロが次になります。Inputステートメントで読み込みしたデータを受け取る変数をBufに変更しました。」で区切った結果をTargetに渡しています。Targetは配列になり、配列の末尾インデックスはUBound(variable)関数で取得できるためFor文で回しています。最初のインデックスは特に設定しない限り0と決まっているので、そのようにしました。ちなみに最初のインデックスはLBound(variable)で取得できます。カンマ区切りのCSVだけではありません。中にはカンマとスペースを組み合わせた区切りのCSVやタブ区切りのCSVも存在します。次ではVBAでそれらを読み込みしてみようと思います。4.特殊な区切りのCSVへ対応するには特殊な区切りのCSVを読み込みするにはSplit関数の区切り文字を変数にして、VBAで動的に変化させる他、あらかじめ置換によってフォーマットを整えておく方法もあります。今回は後者で読み込みましょう。置換はReplace()関数で可能です。置換対象の文字列です。置き換える文字列です。String型これで特殊な区切りに対応しました。タブ文字を打とうと思ったらフォーカスが移動してしまいますね。そのため「合言葉」を定義してマクロのほうで更に置換してあげましょう。これでタブ文字にも対応しました。タブ文字とカンマが組み合わせてある場合は「,」と入力すれば上手く読み込めます。」がある場合は上手く読み込めないのですが、ここでは割愛させていただきます。