- 締切済み
Variant型配列の文字コード変換
CSVデータを読込み、Excelのセルに書込むプログラムを作成しています。 UTF-8で書かれたCSVを読み込むと、もちろんだと思いますが、Excel上で文字化けが生じます。 カンマごとにVariant型の配列に格納してあるのですが、 その中身を取り出し、UTF-8にコード変換する事は出来るのでしょうか。 わかる方いらっしゃいましたら、回答願います。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
エクセル標準の機能では、UTF-8で書かれたCSVファイルを読むことはできないと思います。 そこで、IEを使って読み込みます。 サンプル ---------------------------------------------------------------- Public Sub ReadCSVbyUTF8() Dim IE Dim a, i Set IE = CreateObject("InternetExplorer.Application") IE.Navigate ("file:///C:\sample\UTF-8.txt") While IE.busy: Wend While IE.Document.readyState <> "complete": Wend IE.Document.Charset = "UTF-8" IE.Refresh a = Split(IE.Document.body.innerText, vbCrLf)'行毎配列に IE.Quit For i = 0 To UBound(a) 'カンマ区切りで一行毎取り込み,ココで想定しているのは、2列。別に一気に設定しなくてもいいけど・ Sheets("Sheet1").Range("A2:B2").Offset(i) = Split(a(i), ",") Next End Sub
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 ちょっと、ご質問内容が分りにくいですね。 >UTF-8で書かれたCSVを読み込むと、・・Excel上で文字化け >その中身を取り出し、UTF-8にコード変換する事は出来るのでしょうか。 UTF-8で書かれたCSVをExcelに読み込むということ解釈しました。JISで言う2バイト文字が文字化けしてしまいます。 一応、以下は、UTF-8 で書かれたCSVを、Excelに読み込むコードですから、もし違うようでしたら、またご指摘ください。 今回は、以下にURL のある Basp21 を使いました。それがなくても出来ますが、そのほうが簡単なので使いました。 データ型は、String型に格納しましたので、間違えないようにしてください。しかし、仮に、String型で出力しても、今回は、汎用型にするために、Excelのワークシートに対して、配列出力をやめたので、もしも、ワークシート上のキャスト変換を望まない場合は、予め、書式を文字列にしておいてください。 (例;CSV: 1E3 → Excel: 1.00E+03) Sub UTF8toUnicode() Dim bobj As Basp21 Dim FNo As Integer Dim buf() As Byte Dim bufj As String Dim bufline() As String Dim bufcell() As String Dim i As Long, j As Long, k As Long 'http://www.hi-ho.ne.jp/babaq/basp21.html 'Basp21 のタイプライブラリを参照設定 Set bobj = New Basp21 'CSVファイル名 Const FILENAME As String = "SampleU.csv" FNo = FreeFile() Open FILENAME For Binary Access Read As #FNo buf = InputB(LOF(FNo), #FNo) bufj = bobj.Kconv(buf, 4, 5) Close #FNo bufline = Split(bufj, vbCrLf) Application.ScreenUpdating = False For i = LBound(bufline) To UBound(bufline) j = j + 1 bufcell = Split(bufline(i), ",") For k = LBound(bufcell) To UBound(bufcell) Cells(j, k + 1).Value = bufcell(k) Next k Next i Application.ScreenUpdating = True Set bobj = Nothing End Sub