0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【VBA】UTF-8(BOMなし)+LF改行のテキストファイルを出力する方法

Last updated at Posted at 2025-11-11

はじめに

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.StreamCharset"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回答一発で解決しました…。

悩んだときは調査の仕方を変えるのも一つの手ですね。

もし他にも文字コードや改行に関する情報があれば、ぜひコメントで教えてください!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?