• 締切済み

Variant型配列の文字コード変換

CSVデータを読込み、Excelのセルに書込むプログラムを作成しています。 UTF-8で書かれたCSVを読み込むと、もちろんだと思いますが、Excel上で文字化けが生じます。 カンマごとにVariant型の配列に格納してあるのですが、 その中身を取り出し、UTF-8にコード変換する事は出来るのでしょうか。 わかる方いらっしゃいましたら、回答願います。

みんなの回答

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

エクセル標準の機能では、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)
回答No.1

こんばんは。 ちょっと、ご質問内容が分りにくいですね。 >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

関連するQ&A