改行コードの振る舞い

にメンテナンス済み

VBA でテキストを扱うと、メッセージボックスやセル、テキストファイルで改行が意図どおりに動かないことがあります。原因の多くは改行コードの違いです。

この記事では、VBA の改行コード(vbCrLf・vbCr・vbLf・vbNewLine)の違いと使い分け、セルやファイルでの振る舞い、改行の分割・統一方法を解説します。

VBA で使用される改行コードの種類

改行を表す文字には、以下の 2 種類があります。

  1. CR(キャリッジリターン): ASCII コード 13
  2. LF(ラインフィード): ASCII コード 10

Windows では、この 2 つを組み合わせた CRLF が改行として使われます。一方、Linux や macOS などの Unix 系システムでは LF のみが一般的です。

VBA の改行コード定数

VBA には、改行を表す定数があらかじめ用意されています。

定数値説明
vbCrLfChr(13) & Chr(10)CR + LF(Windows の標準)
vbCrChr(13)CR のみ
vbLfChr(10)LF のみ
vbNewLine実行環境に依存Windows では CRLF、Mac では CR(Microsoft 公式ドキュメントより)

Windows 上の VBA で一般的な改行には、vbCrLf または vbNewLine を使用します。

改行コードの使用例

vbCrLf を使った改行

文字列を & で連結して、改行を挿入します。

Sub InsertNewLine()
    Dim str As String
    str = "この行の後に改行を追加します。" & vbCrLf & "これは新しい行です。"
    MsgBox str
End Sub

vbCr と vbLf の個別使用

vbCr や vbLf を単独で使う場面は多くありませんが、LF だけで改行されたテキストを扱う場合などに必要になります。

Sub UseCrAndLfIndividually()
    Dim strCr As String
    Dim strLf As String
    strCr = "CR の後の文字列です。" & vbCr & "この文字が次の行の先頭にきます。"
    strLf = "LF の後の文字列です。" & vbLf & "この文字が次の行の先頭にきます。"
    MsgBox strCr
    MsgBox strLf
End Sub

改行コードの振る舞い

セルでの改行

セルの値に改行を含めるには、vbLf を使うのが確実です。Excel でセル内改行を手動入力する Alt + Enter は、内部的には LF として扱われるためです。

Sub SetCellWithLineBreak()
    With Range("A1")
        .Value = "1行目" & vbLf & "2行目"
        .WrapText = True ' 折り返して全体を表示する
    End With
End Sub
チェック

セル内の改行は、セルの書式設定で「折り返して全体を表示する」(WrapText = True)が有効な場合のみ、改行として表示されます。改行を入れたのに 1 行で表示される場合は、この設定を確認してください。

ファイル入出力での改行

テキストファイルの改行コードは、OS やアプリによって異なります。Windows は CRLF、Unix 系は LF が一般的です。

Print # ステートメントは、出力の末尾に自動で改行(Windows では CRLF)を付加します。そのため、文字列の最後に vbCrLf を付ける必要はありません。

Sub WriteToFile()
    Dim fileNum As Integer
    Dim text As String
    fileNum = FreeFile
    Open "C:\example.txt" For Output As #fileNum
    text = "この行で終了" & vbCrLf & "次の行が始まります。"
    Print #fileNum, text ' 末尾にも改行が付加される
    Close #fileNum
End Sub
文字コードにも注意

Open ... For Output で書き出したファイルは、UTF-8 ではなく Windows の既定のコードページ(日本語環境では Shift_JIS 系)になります。UTF-8 で出力したい場合は、ADODB.Stream などを利用してください。

注意点

異なるプラットフォーム間でテキストファイルをやり取りすると、改行コードの違いが問題になることがあります。例えば、LF のみのファイルを古いメモ帳などで開くと、改行されず 1 行につながって表示される場合があります。

実践的な使用例

改行で文字列を分割する

Sub SplitByLineBreak()
    Dim text As String
    Dim lines() As String

    text = "1行目" & vbCrLf & "2行目" & vbCrLf & "3行目"

    ' CRLF で分割
    lines = Split(text, vbCrLf)

    Dim i As Long
    For i = LBound(lines) To UBound(lines)
        Debug.Print (i + 1) & "行目: " & lines(i)
    Next i
End Sub

改行コードを変換する

LF を CRLF に変換する例です。

Sub ConvertLineBreaks()
    Dim text As String

    ' LF のみの文字列(Unix 形式)
    text = "1行目" & vbLf & "2行目" & vbLf & "3行目"

    ' CRLF に変換(Windows 形式)
    text = Replace(text, vbLf, vbCrLf)

    Debug.Print text
End Sub

混在した改行コードを統一する

CRLF・LF・CR が混在している場合は、いったん LF に揃えてから目的の改行コードに変換します。

Sub NormalizeLineBreaks()
    Dim text As String

    ' 改行コードが混在した文字列
    text = "1行目" & vbCrLf & "2行目" & vbLf & "3行目" & vbCr & "4行目"

    text = Replace(text, vbCrLf, vbLf) ' まず CRLF を LF に
    text = Replace(text, vbCr, vbLf)   ' 残った CR を LF に
    text = Replace(text, vbLf, vbCrLf) ' すべての LF を CRLF に

    Debug.Print text
End Sub
変換の順序に注意

いきなり Replace(text, vbLf, vbCrLf) を実行すると、すでに CRLF になっている箇所の LF まで変換され、CR + CR + LF になってしまいます。必ず先に LF へ統一してから変換してください。

セル内の改行を判定・分割する

Sub WorkWithCellLineBreaks()
    Dim cellValue As String
    cellValue = Range("A1").Value

    If InStr(cellValue, vbLf) > 0 Then
        Dim lines() As String
        lines = Split(cellValue, vbLf)
        Debug.Print "行数: " & (UBound(lines) + 1)
    End If
End Sub

まとめ

  • Windows で一般的な改行には vbCrLf(または vbNewLine)を使う
  • セル内改行は LF(vbLf)で、表示には WrapText = True が必要
  • ファイルをやり取りする際は、改行コード(と文字コード)の違いに注意する
  • 改行コードが混在している場合は、いったん LF に統一してから変換する
#VBA #改行コード #CR #LF #vbCrLf