外部 UTF-8 ファイル

Posted by muchag | Excel VBA | 2015-05-20 (水) 16:45:27

毎回同じ質問を Google 先生にしているので、いい加減まとめておきます。。。

【環境】
Excel:2010
準備

文字コード UTF-8 に対応するためには、ライブラリの参照設定が必要。

Visual Basec Editor の
[ツール]-[参照設定]
[参照可能なライブラリ ファイル]
[Microsoft ActiveX Data Object *.* Library]
というのが複数並んでいるので、2.5以降にチェック。
(まぁ、最新がよいのではないでしょうか)

読み込み
文字コード変換
  1. Dim csv As String
  2.  
  3. With CreateObject("ADODB.Stream")
  4.     .Charset = "UTF-8"
  5.     .Open
  6.     .LoadFromFile "C:\hoge.csv"
  7.     csv = .ReadText
  8.     .Close
  9. End With

これで、変数 csv に、ファイル全体文字列が格納されているので
適宜整形して、利用。

改行コード変換

改行コード については、こんな感じ。

Excel 用に vbCrLf で統一しておく方が問題が出ないので
下記のように置換すると吉。

  1. csv = Replace(csv, vbLf, vbCrLf)
  2. csv = Replace(csv, vbCr, vbCrLf)
利用
CSV
  1. Dim arrLines As Variant
  2. arrLines = Split(csv, vbCrLf)
  3.  
  4. Dim arrFieldsAs Variant
  5. For index = 0 To UBound(arrLines)
  6.  
  7.     arrFields= Split(arrLines(index ), ",")
  8.  
  9. Next
書き出し

読み込み編とは時期が異なったので、書き方が全然違うけど、
そこは気にしない!

  1. Dim string as String
  2. Dim i As Long
  3. Dim j As Integer
  4.  
  5. Dim outStream As ADODB.Stream
  6. Set outStream = New ADODB.Stream
  7.  
  8. 'ADODB.Stream の設定
  9. With outStream
  10.     .Type = adTypeText
  11.     .Charset = "UTF-8"
  12.     .LineSeparator = adLF '改行コードをLFに指定
  13.     .Open
  14. End With
  15.  
  16. ' データの書き出し
  17. For i = 1 To 100
  18.     For j = 1 To 5
  19.         If j > 1 Then string = string & ","
  20.        
  21.         string = string & Cells(i, j).Value
  22.     Next j
  23.    
  24.     outStream.WriteText string , adWriteLine
  25. Next i
  26.  
  27. 'BOMを削る前処理
  28. outStream.Position = 0 'ファイル先頭にセット
  29. outStream.Type = adTypeBinary 'バイナリに変更
  30. outStream.Position = 3 'BOMの3バイト分スキップ
  31.  
  32. 'BOMを削った分をコピー
  33. Dim outStreamCopy As New ADODB.Stream
  34. outStreamCopy.Type = adTypeBinary
  35. outStreamCopy.Open
  36. outStream.CopyTo outStreamCopy
  37.  
  38. 'CSVファイルに保存
  39. outStreamCopy.SaveToFile Activebook.Path & "\text_utf8n.csv", adSaveCreateOverWrite
  40.  
  41. 'クローズ処理
  42. outStream.Close
  43. outStreamCopy.Close
  44. Set outStream = Nothing
  45. Set outStreamCopy = Nothing
ユーティリティー

毎回書いていられないので、ユーティリティークラスを作成。

utilUtf8
  1. Option Explicit
  2.  
  3. Public Function inputStream(ByVal filePath As String) As String
  4.    
  5.     Dim strWhole As String
  6.      
  7.     With CreateObject("ADODB.Stream")
  8.         .Charset = "UTF-8"
  9.         .Open
  10.         .LoadFromFile filePath
  11.         strWhole = .ReadText
  12.         .Close
  13.     End With
  14.  
  15.     strWhole = Replace(strWhole, vbLf, vbCrLf)
  16.     strWhole = Replace(strWhole, vbCr, vbCrLf)
  17.  
  18.     Set inputStream = strWhole
  19.        
  20. End Function
  21.  
  22. Public Function getOutStream(ByVal outStream As ADODB.Stream) As ADODB.Stream
  23.    
  24.     'ADODB.Stream の設定
  25.     With outStream
  26.         .Type = adTypeText
  27.         .Charset = "UTF-8"
  28.         .LineSeparator = adLF '改行コードをLFに指定
  29.         .Open
  30.     End With
  31.    
  32.     Set getOutStream = outStream
  33.        
  34. End Function
  35.  
  36. Public Sub outputStream(ByVal outStream As ADODB.Stream, ByVal filePath As String, ByVal noBom As Boolean)
  37.  
  38.     If noBom Then
  39.         'BOMを削る前処理
  40.         outStream.Position = 0 'ファイル先頭にセット
  41.         outStream.Type = adTypeBinary 'バイナリに変更
  42.         outStream.Position = 3 'BOMの3バイト分スキップ
  43.     End If
  44.  
  45.     'BOMを削った場合に備えてコピーを出力
  46.     Dim outStreamCopy As New ADODB.Stream
  47.     outStreamCopy.Type = adTypeBinary
  48.     outStreamCopy.Open
  49.     outStream.CopyTo outStreamCopy
  50.  
  51.     'ファイルに保存
  52.     outStreamCopy.SaveToFile filePath, adSaveCreateOverWrite
  53.    
  54.     outStreamCopy.Close
  55.     Set outStreamCopy = Nothing
  56.    
  57.     outStream.Close
  58.    
  59. End Sub
参考サイト

Excel VBAでUTF-8(BOM無し)に変換してCSV出力してみる
→書き出し編。参考というより、ソースを頂戴しました。ありがとうございます♪

Excel VBA | 2015-05-20 (水) 16:45:27 |

コメントはまだありません »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment