• 締切済み

ExcelでUTF-8のcsvデータを表示するには

あるデータベースから出力したCSV形式のデータがあるのですが、 文字コードがUTF-8なので、直接Excelで開くと文字化けがあります。 なので、一度出力したcsvファイルの拡張子をtxtに変えて、 それをExcelから開くという作業をして対応しています。 (そうすると文字コードが選択できるので) しかしcsvをtxtに変えてExcelで開くと、 思いもよらぬところで改行されてしまい、 正しくデータが表示されません。 例)csvでそのまま開いたとき ユーザーコード 苗字 名前 住所 001    山田 太郎 東京都大田区鵜の木 1-2-3 002    高橋 愛子 東京都港区六本木2-3-4 ↓ txtに変換したのちにexcelで開いたとき ユーザーコード 苗字 名前 住所 001    山田 太郎 東京都大田区鵜の木 1-2-3                  ←余計な改行が発生 002    高橋 愛子 東京都港区六本木2-3-4 これを回避するために、一度csvで開いて、 セル内改行コードを空白と置き換えるという作業をしたのですが、 それでも上記のような改行が発生してしまっています。 UTF-8のcsvを文字化けなくExcelで開く方法は他にはないでしょうか? また上記方法の改善点はありますでしょうか? ご助言宜しくお願いします。

みんなの回答

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

もう読んでないかもしれませんが、、、 UTF-8 には BOM(Byte Order Mark)があるものと、無いものが あります。公称ではありませんが、一般的には  ・UTF-8 (BOM有り)  ・UTF-8N(BOM無し) などの呼び方で区別されるようです。 Excel で UTF-8 エンコードされた CSV を開くには、この BOM が 無いと文字化けします。そのシステムから出力された CSV は、 UTF-8N なのでしょう。対策として、  ・TeraPad などのエディタで「文字コード指定保存」コマンドを   使い、UTF-8(BOM有り)で保存しなおす  ・VBA で BOM バイナリをくっつけてから開く などの方法がとれそうです。 後者の VBA を利用するなら以下のようなソースになると思いますが、 エディタを使った方が簡単でしょう。 なお、下記ソースは必要最小限のことしか書いてません。試す場合は、 バックアップをとってからでお願いします。 勘違い回答ならばスルーの方向で。。 Public Sub OpenCSV_UTF8()      Dim fn As String   fn = CStr(Application.GetOpenFilename("CSVファイル (*.csv), *.csv", _                      MultiSelect:=False))   If UCase$(fn) = "FALSE" Then     Exit Sub   End If      If AddUTF8BomBinary(fn) Then     Dim wb As Workbook     Set wb = Workbooks.Open(fn)   End If End Sub ' // UTF-8 エンコードされたファイルの BOM の有無を確認し、 ' // BOM 無し(UTF-8N)ならば、BOM 付きで上書きする ' Public Function AddUTF8BomBinary(ByVal fn As String) As Boolean   Const adTypeBinary     As Long = 1   Const adSaveCreateOverWrite As Long = 2      On Error GoTo Err_   ' UTF-8 BOM バイナリデータ   Dim bin(2) As Byte   bin(0) = &HEF   bin(1) = &HBB   bin(2) = &HBF      ' ファイルからバイナリストリームを作成   Dim stm1 As Object ' ADODB.Stream   Set stm1 = CreateObject("ADODB.Stream")   stm1.Type = adTypeBinary   stm1.Open   stm1.LoadFromFile fn      ' UTF-8 BOM の有無確認   Dim bHasBom As Boolean   Dim i    As Long   bHasBom = True   For i = 0 To UBound(bin)     If stm1.Read(1)(0) <> bin(i) Then       bHasBom = False       Exit For     End If   Next i   ' BOM 無し(UTF-8N)ならBOMを加えて上書きする   If Not bHasBom Then     Dim stm2 As Object ' ADODB.Stream     Set stm2 = CreateObject("ADODB.Stream")     stm2.Type = adTypeBinary     stm2.Open     stm2.Write bin     stm1.Position = 0     stm1.CopyTo stm2     stm1.Close     stm2.SaveToFile fn, adSaveCreateOverWrite     stm2.Close   End If   AddUTF8BomBinary = True Bye_:   On Error Resume Next   stm1.Close: Set stm1 = Nothing   stm2.Close: Set stm2 = Nothing   Exit Function Err_:   MsgBox Err.Description, vbCritical   Resume Bye_ End Function

回答No.1

直接の回答ではないのですが……。 もしも、文字コードを変更しても良いのであれば、 http://www.vector.co.jp/soft/dl/win95/util/se326595.html というようなソフトで、shift-jis に変換してしまえばいいかと思います。 UTF-8 のまま編集する必要があるのなら(編集の規模にもよりますが)EmEditor というエディタをお勧めします。 http://jp.emeditor.com/ ちょっと高いですが(といっても、4,200円ですが)UTF-8 の、CSV ファイルを表示する・編集をするためには、十分な機能を持っています。 (UTF-8 を含む ユニコード対応と、csv 編集モードつき) 元々がエディタですので、文字の編集や検索・置換は得意ですし、csv で分離されたひとつの項目であれば、一括削除や、それをキーにしたソートも可能です。

meimu172
質問者

お礼

早々のご回答ありがとうございます! UTF-8のまま編集できるソフトがあるんですね。 ちょっと体験版を試してみたいと思います! ただUTF-8のデータをほぼ参照するだけなので (海外の登録者の名前などを見る) 有償ソフトを使うほどでもないかなぁ。。 でも奥の手はこちらのソフトを使用したいと思います。 有難うございました。

関連するQ&A