【Excel VBA】If Elseとは違う条件式(Select Case)について
エンジニアのIMMRです。Excel VBAの条件式には、以前に説明したExcel VBA 条件式(If Else)とこれから説明するSelect Caseの二つあります。1.従来のIf Else条件式If Elseは条件に合った時は処理Aを、条件に合わなかったら処理Bを実行します。では、下記のようなデータがあり、複数の条件があるとします。If Elseを使用して作成すると2種類の方法が浮かぶと思
Workteria(ワークテリア)では難易度の高いものから低いものまで、スキルや経験に合わせた案件を多数揃えています。会員登録は無料ですので、ぜひ会員登録してご希望の案件を探してみてください!
フリーランス/正社員のエンジニアとして活躍するには、ご自身のスキルや経験に合わせた仕事を選ぶことが大切です。ご希望の案件がみつからない場合はお気軽にお問い合わせください!ユーザ満足度の高いキャリアコンサルタントが在籍していますので、希望条件や悩み事などなんでもご相談ください。ご希望にピッタリの案件をご紹介させていただきます。
皆さんこんにちは、エンジニアのIMMRです。
VBAでは、CSVを読み込むことができます。読み込む方法の記事も以前に作成しています。
この上記記事では、「Line Input」で読み込む方法を説明しています。
しかし、上記の方法でUTF-8のCSVデータを読み込むと下記図のように文字化けを起こしてしまいます。
図1 CSV(取り込み)文字化けの場合

ちなみにインプットとなっているCSVに問題はないです。
図2 CSVデータ(参加者名簿)

このような文字化けが起きないようにCSVファイルを読み込んでいきたいです。
いままでは、Shift-JIS形式のCSVデータであったのでLine Inputで正しく読み込むことが出来ましたが、
現在のCSVデータはUTF-8形式のデータであるため、読み込むことができません。
なぜ正しく読み取ることができないかというとUTF-8はUnicode のファイルです。
しかし、 Windowsで一般的に使用されるのはShift-JISです。
そのため、Line Inputの命令で行うとShift-JISデータだと勝手に判断して読み込んでしまうため、
文字化けという現象が発生してしまうのです。
そのため、今まで使用してきた「Line Input」ではなく、「ADODB.Streamオブジェクト」の
方法でCSVを読み取る必要があります。
ADODB.Streamオブジェクトを使用するためには、まずはライブラリを設定する必要があります。
①Visual Basicをクリックします。
図3 設定1

②ツールの「参照設定」をクリックします。
図4 設定2

③「Microsoft ActiveX Data Objects 6.1 Library」を選択して、OKをクリック
ここでは6.1を選択していますが、それ以降で最新のものがあればそれを選択します。
図5 設定3

これで準備完了です。
次に「ADODB.Stream」を設定して、CSVを読み込みます。
①ADODB.Streamオブジェクトの生成
Dim ado As Object
Set ado = CreateObject("ADODB.Stream")※ADODB.Streamにより、オブジェクトを生成します。
②ADODB.Streamオブジェクトの文字コードの設定
ado.Charset = "UTF-8"※先ほど、作成したADODB.Streamの「ado」オブジェクトに文字コード”UTF-8”を設定します。
③ADODB.Streamオブジェクトのオープン
ado.Open※先ほど、作成したADODB.Streamの「ado」オブジェクトをオープン
④ADODB.StreamオブジェクトでオープンするCSVの設定
Dim File_name As String
File_name = "C:\記事\INPUT.csv"
ado.LoadFromFile (File_name)※File_nameを文字列で宣言して、その中に読み込むCSVデータが格納されているパスをセットします。
そしたら、CSVファイルをオープンします。
⑤EOFまで読み込む
Do Until ado.EOS
Loop※Line Inputと同じようにDo Untilを使用して、EOF(End Of File)まで読み込みます。
⑥1列読み込む
Dim buf As String
buf = ado.ReadText(adReadLine)※「buf」という変数を文字型で宣言して、その中にADODB.Streamの「ado」オブジェクトで
読み込んだ1行格納されます。
⑦ ⑥で読み込んだのは1行です。そのため、”1111,AAA,BBB,CCC,DDD”のように
,で区切りがされていないため、区切る必要があります。
Dim tmp As Variant
tmp = Split(buf, ",")※Split関数により、","で区切ります。そして、配列:tmpに格納されます。
⑧ 格納された tmp(配列)に格納された値を1つずつセルに格納する
j = j + 1
For i = 0 To UBound(tmp)
Cells(j, i + 1) = tmp(i)
Next※UBoundを使用して配列に投稿した値をセルにセットしていきます。
配列は、0から始まるのでi=0からで行っていますが、セルではCell(j,0)というような箇所はないので、i+1にしています。
では、以上のことよりサンプルプログラムを作成していきます。
Sub test1()
Dim i As Long, j As Long
Dim File_name As String, buf As String
Dim tmp As Variant
Dim ado As Object
Set ado = CreateObject("ADODB.Stream")
File_name = "C:\記事\INPUT.csv"
ado.Charset = "UTF-8"
ado.Open
ado.LoadFromFile (File_name)
j = 0
Do Until ado.EOS
buf = ado.ReadText(adReadLine)
tmp = Split(buf, ",")
j = j + 1
For i = 0 To UBound(tmp)
Cells(j, i + 1) = tmp(i)
Next
Loop
Close #1
End Sub※ファイルの配下は「"C:\記事\INPUT.csv"」です。
3で説明したオブジェクトの設定方法により、
①~⑧の順序でCSVを読み込み、セルの値貼り付けを行います。
図6 実行結果

そのような方はぜひ、Workteriaサイトをご利用ください!
定期的にご本人に合う高額案件を紹介
リモートワークなど自由な働き方ができる案件多数
専属エージェントが契約や請求をトータルサポート