はじめに
Windows環境でVBAを使ってテキストファイルを出力する際、**デフォルトでは Shift_JIS かつ CRLF(Windows改行)**になります。しかし、Linuxやクラウド環境との連携では、UTF-8(BOMなし)+LF改行が求められるケースも増えています。
この記事では、従来のVBAファイル出力方法と、UTF-8(BOMなし)+LF改行で出力する方法を比較しながら、実装のポイントを解説します。
修正前のコード:従来のファイル出力
Open fullPath For Output As #fileNum
For i = LBound(header) To UBound(header)
Print #fileNum, header(i)
Next i
For Each item In logLines
Print #fileNum, item
Next item
Close #fileNum
問題点
- 文字コード:Shift_JIS(VBAの標準)
-
改行コード:
Print文は自動的に CRLF を挿入 - BOM:Shift_JISにはBOMはないが、UTF-8に切り替える手段がない
この方法では、Linux環境やUTF-8を要求するツールで文字化けや改行不整合が起こる可能性があります。
修正後のコード:UTF-8(BOMなし)+LF改行で出力
Set textStream = CreateObject("ADODB.Stream")
Set binaryStream = CreateObject("ADODB.Stream")
' 本文の連結(LF改行)
Dim bodyText As String
bodyText = ""
Dim item As Variant
For Each item In logLines
bodyText = bodyText & item & vbLf
Next item
' ヘッダー情報(LF改行に統一)
Dim headerText As String
headerText = "...省略..."
' 全体のテキスト
Dim fileData As String
fileData = headerText & bodyText
With textStream
.Charset = "UTF-8"
.Open
.WriteText fileData
.Position = 3 ' BOMをスキップ
With binaryStream
.Type = 1
.Open
textStream.CopyTo binaryStream
.SaveToFile outputPath, 2
.Close
End With
.Close
End With
改善点
-
文字コード:
ADODB.StreamのCharsetを"UTF-8"に設定 -
BOM除去:
.Position = 3により、UTF-8の先頭3バイト(BOM)をスキップ -
改行コード:
vbLfを使用して LF改行 に統一 - 出力方法:バイナリモードで保存することで、BOMなしのUTF-8ファイルが完成
実装のポイント
1. 改行コードの統一
従来は vbCrLf(CRLF)を使用していましたが、LF改行にするには vbLf を使います。
headerText = "..." & vbLf & "# ..." & vbLf
2. BOMの除去
ADODB.Stream を使うと UTF-8 で書き出せますが、BOMが自動的に付加されます。これを除去するには .Position = 3 を使って、先頭3バイトをスキップしてバイナリコピーします。
3. ADODB.Streamの2段構え
- テキストストリーム:UTF-8で文字列を書き込む
- バイナリストリーム:BOMを除いた内容を保存する
まとめ
| 比較項目 | 修正前 | 修正後 |
|---|---|---|
| 文字コード | Shift_JIS | UTF-8(BOMなし) |
| 改行コード | CRLF | LF |
| BOM | なし | 明示的に除去 |
| 対応環境 | Windows向け | Linux/クラウド向け |
UTF-8(BOMなし)+LF改行は、クロスプラットフォームでの互換性を高めるために非常に重要です。VBAでも ADODB.Stream を活用すれば、柔軟に対応できます。
おわりに
今回はBOMを除去することに苦戦しました。MicrosoftのCopilotで調査してもなかなかうまくいかなかったので、シンプルにGoogleで検索したところ、最初のAI回答一発で解決しました…。
悩んだときは調査の仕方を変えるのも一つの手ですね。
もし他にも文字コードや改行に関する情報があれば、ぜひコメントで教えてください!