[エクセルVBA] シートの内容をUTF-8のBOMなしCSVファイルに書き出したい
エクセル上で管理しているデータをCSVデータに吐き出して、別のシステムにインポートできるようにするVBAマクロです。おおまかな動作仕様は以下のような形です。
- エクセルファイル内の「CSV」シートの全セルをチェックし、空行は無視して書き出す
- エクセルファイルと同じフォルダに「export.csv」というファイル名で書き出す
- CSVは文字コードUTF-8のBOMなし形式で書き出す
サンプルコード
Sub ExportToCSV()
Dim sheet As Worksheet
Set sheet = ThisWorkbook.Sheets("CSV")
Dim filePath As String
filePath = ThisWorkbook.Path & "\export.csv"
Dim csvText As String
Dim row As Long, col As Long
For row = 1 To sheet.UsedRange.Rows.Count
'空行のチェック:行内のセルすべてが空であれば書き出しをスキップ
Dim isEmptyRow As Boolean
isEmptyRow = True
For col = 1 To sheet.UsedRange.Columns.Count
If sheet.Cells(row, col).Value <> "" Then
isEmptyRow = False
Exit For
End If
Next col
If Not isEmptyRow Then
For col = 1 To sheet.UsedRange.Columns.Count
csvText = csvText & sheet.Cells(row, col).Value & ","
Next col
csvText = Left(csvText, Len(csvText) - 1) & vbCrLf
End If
Next row
csvText = Left(csvText, Len(csvText) - 2)
Dim objStream As Object
Set objStream = CreateObject("ADODB.Stream")
With objStream
.Charset = "UTF-8"
.LineSeparator = -1 'adCRLF
.Open
.WriteText csvText
'バイナリ変換するためにPositionを0にする
.Position = 0
'Typeを変更してバイナリ変換
.Type = 1 'adTypeBinary
'Positionを再設定してBOMデータが格納されている最初の3バイトをスキップ
.Position = 3
'バイナリデータとして一時保存
Dim byteData() As Byte
byteData = .Read
.Close
.Open
.Write byteData
.SaveToFile filePath, 2 'adSaveCreateOverWrite
.Close
End With
MsgBox "書き出しが完了しました。"
End Sub
BOMなし形式の書き出しは、下記ウェブサイトを参考にさせていただきました。
エクセルVBAでBOM無しのUTF-8でCSVファイルなどを出力する方法
ご質問など受け付けています
記事の中でわかりにくかったところ、もっと知りたかったこと、間違っていることなど、何でもお気軽にご連絡ください。
ご連絡は下記フォームを利用いただくか、ツイッターアカウント@flat8migi宛てでもOKです。