改行コードの振る舞い
VBA でテキストを扱うと、メッセージボックスやセル、テキストファイルで改行が意図どおりに動かないことがあります。原因の多くは改行コードの違いです。
この記事では、VBA の改行コード(vbCrLf・vbCr・vbLf・vbNewLine)の違いと使い分け、セルやファイルでの振る舞い、改行の分割・統一方法を解説します。
VBA で使用される改行コードの種類
改行を表す文字には、以下の 2 種類があります。
- CR(キャリッジリターン): ASCII コード 13
- LF(ラインフィード): ASCII コード 10
Windows では、この 2 つを組み合わせた CRLF が改行として使われます。一方、Linux や macOS などの Unix 系システムでは LF のみが一般的です。
VBA の改行コード定数
VBA には、改行を表す定数があらかじめ用意されています。
| 定数 | 値 | 説明 |
|---|---|---|
| vbCrLf | Chr(13) & Chr(10) | CR + LF(Windows の標準) |
| vbCr | Chr(13) | CR のみ |
| vbLf | Chr(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 に統一してから変換する