ExcelマクロVBAサンプル集 | UTF-8でCSVの読み書き(ADODB.Stream) | Excelマクロの実用サンプル、エクセルVBA集と解説



最終更新日:2017-03-16

UTF-8でCSVの読み書き(ADODB.Stream)


VBAでUTF-8を扱う為には、ADODB.Streamを使う必要があります。

以下のコードを使用するには、

参照設定で、「Microsoft ActiveX Data Objects 2.8 Library」にチェックを付けて下さい。


または、

Dim adoSt As New ADODB.Stream
ここを
Dim adoSt As Object
Set adoSt = CreateObject(ADODB.Stream)

として下さい。

私としては、めったに使う事もないので、

自分の覚書として掲載ししました。


アクティブシートの内容をUTF-8でCSV出力します

Sub sample1()
  Dim i As Long
  Dim j As Long
  Dim strList As String
  Dim adoSt As Object
  Set adoSt = CreateObject("ADODB.Stream")
  With adoSt
    .Type = adTypeText
    .Charset = "UTF-8"
    .Open
  End With
  With ActiveSheet.UsedRange
    For i = 1 To .Rows.Count
      strList = ""
      For j = 1 To .Columns.Count
        If j > 1 Then
          strList = strList & ","
        End If
        strList = strList & .Cells(i, j)
      Next
      adoSt.WriteText strList, adWriteLine
    Next
  End With
  adoSt.SaveToFile "C:\test.txt", adSaveCreateOverWrite
  adoSt.Close
  Set adoSt = Nothing
End Sub


シートのUsedRangeをCSV出力しています。

※本記事を掲載後に、BOM無しのUTF8(UTF8N)でCSVを作成することがありましたので追記します。

詳細は、以下のページに詳しく書かれていますので、参考にしてください。
エクセルVBAでBOM無しのUTF-8でCSVファイルなどを出力する方法

adoSt.SaveToFile "C:\test.txt", adSaveCreateOverWrite
adoSt.Close 

この部分を

Dim byteData() As Byte
With adoSt
  .Position = 0
  .Type = adTypeBinary
  .Position = 3
  byteData = .Read
  .Close
  .Open
  .Write byteData
  .SaveToFile sFile, adSaveCreateOverWrite
  .Close
End With

このようにすることで、BOM無し(UTF8N)でCSVを作成できます。


UTF-8のCSVを読込、シートに出力します。

Sub sample2()
  Dim i As Long
  Dim j As Long
  Dim strList As String
  Dim strSplit() As String
  Dim adoSt As New ADODB.Stream
  i = 1
  With adoSt
    .Type = adTypeText
    .Charset = "UTF-8"
    .Open
    .LoadFromFile ("C:\test.txt")
    Do While Not (.EOS)
      strList = .ReadText(adReadLine)
      strSplit = Split(strList, ",")
      For j = LBound(strSplit) To UBound(strSplit)
        Cells(i, j + 1) = strSplit(j)
      Next
      i = i + 1
    Loop
    .Close
  End With
End Sub


UTF-8のCSVを行単位で読込、アクティブシーヘ書き出しています。


ADODB.Streamのメソッドとプロパティ

Open メソッドを使って、Record または URL から Stream を開きます。

Close メソッドを使って、Stream を閉じます。

Write メソッドまたは WriteText メソッドを使って、バイトまたはテキストを Stream に入力します。

Read メソッドまたは ReadText メソッドを使って、Stream からバイトを読み取ります。

Flush メソッドを使って、ADO バッファにある Stream データを基になるオブジェクトに書き込みます。

CopyTo メソッドを使って、Stream の内容を別の Stream にコピーします。

SkipLine メソッドおよび LineSeparator プロパティを使って、ソース ファイルから行を読み取る方法を制御します。

EOS プロパティおよび SetEOS メソッドを使って、ストリーム位置の末尾を設定します。

SaveToFile メソッドおよび LoadFromFile メソッドを使って、ファイル内のデータを保存および復元します。

Charset プロパティを使って、Stream の保存に使う文字セットを指定します。

Cancel メソッドを使って、非同期 Stream 操作を停止します。

Size プロパティを使って、Stream 内のバイト数を設定します。

Position プロパティを使って、Stream 内の現在の位置を制御します。

Type プロパティを使って、Stream 内のデータ型を設定します。

State プロパティを使って、Stream の現在の状態 (開いている、閉じている、または実行中) を設定します。

Mode プロパティを使って、Stream のアクセス モードを指定します。





同じテーマ「ExcelマクロVBAサンプル集」の記事

ADOでマスタ付加と集計(SQL)
ADOでマスタ更新(SQL)
ADOでCSVの読み込み(SQL)
Excelファイルを開かずにシート名を取得
Excelファイルを開かずにシート名をチェック
CSVの読み込み方法(改)
CSVの読み込み方法(改の改)

新着記事 ・・・新着記事一覧を見る

最後の空白(や指定文字)以降の文字を取り出す|エクセル関数超技(3月26日)
先頭の数値、最後の数値を取り出す|エクセル関数超技(3月26日)
Excelファイルを開かずにシート名をチェック|ExcelマクロVBAサンプル集(3月23日)
数式の参照しているセルを取得する|ExcelマクロVBAサンプル集(3月18日)
CSVの読み込み方法(改の改)|ExcelマクロVBAサンプル集(3月17日)
変数とプロシージャーの命名について|ExcelマクロVBA技術解説(2月12日)
ファイルの一覧取得・削除(File)|Google Apps Script入門(1月24日)
フォルダの一覧取得・作成・削除(Folder)|Google Apps Script入門(1月24日)
フォルダとファイルを扱う(DriveApp)|Google Apps Script入門(1月24日)
スプレッドシートが非常に遅い、高速化するには|Google Apps Script入門(1月17日)

アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|ExcelマクロVBA入門
2.RangeとCellsの使い方|ExcelマクロVBA入門
3.徹底解説(VLOOKUP,MATCH,INDEX,OFFSET)|エクセル関数超技
4.Range以外の指定方法(Cells,Rows,Columns)|ExcelマクロVBA入門
5.セルの参照範囲を可変にする(OFFSET,COUNTA,MATCH)|エクセル関数超技
6.セルのコピー&値の貼り付け(PasteSpecial)|ExcelマクロVBA入門
7.変数とデータ型(Dim)|ExcelマクロVBA入門
8.ひらがな⇔カタカナの変換|エクセル基本操作
9.CSVの読み込み方法|ExcelマクロVBAサンプル集
10.VBAのFindメソッドの使い方には注意が必要です|ExcelマクロVBA技術解説



  • >
  • >
  • >
  • UTF-8でCSVの読み書き(ADODB.Stream)

  • このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


    記述には細心の注意をしたつもりですが、
    間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
    なお、掲載のVBAコードは自己責任で使ってください。万一データ破損等の損害が発生しても責任は負いません。

    ↑ PAGE TOP