Excel VBA

In Excel VBA, line‐break codes like vbCrLf and vbLf are special strings that insert row separators into text, controlling how it appears in cells and how it is read from or written to files.

改行コード

改行コードとは何か

覚えどころ

Windows系テキスト
\r\n(キャリッジリターン + ラインフィード)
UNIX・macOS系テキスト
\n(ラインフィードのみ)
旧Mac OS(~9)
\r(キャリッジリターンのみ)

VBAが用意する改行“定数”と“関数”

vbCrLf
実体
Chr$(13) & Chr$(10)
主な用途
MsgBox やテキストファイル出力など、Windowsでの標準的な改行
補足
迷ったらこれ。ほぼすべてのWindows環境で安全に使える
vbCr
実体
Chr$(13)
主な用途
旧Mac OS(〜9)向けCSV書き出しなど特殊用途
補足
単体で使うケースはまれ。UNIX系では改行と認識されない点に注意
vbLf
実体
Chr$(10)
主な用途
Linux/UNIX系CSV出力、セル内改行(Alt+Enter)と同値
補足
macOSでも機能するため、クロスプラットフォームを意識するなら必修
vbNewLine
実体
実行環境依存(WindowsならvbCrLf、UNIXならvbLf
主な用途
複数OS間で配布するVBAプロジェクトの改行コード吸収
補足
Excel 97以降で利用可。環境判定コードを書く手間を省ける
Chr$(10) / Chr$(13)
実体
文字コードを直接指定
主な用途
高速な置換処理や細粒度の制御が必要なとき
補足
可読性低下と表裏一体。大量ループ時の最適化テクとして覚えると便利
Application.International(xlRowSeparator)
実体
OSやロケール設定に合わせた行区切り文字を取得
主な用途
CSV生成でユーザーの設定に完全追従させたいとき
補足
列区切り(xlColumnSeparator)など他の国際化情報も取得できるので併用推奨

vbCrLf で改行

 VBAで、「vbCrLf」を使って、セルに値を入力してみます。

VBA

Sub test1()
	'変数a を宣言
	Dim a As String
	
	'vbCrLf で改行
	a = "aaa" & vbCrLf & "bbb"
	
	'セルに入力
	ActiveSheet.Cells(1, 1) = a
End Sub

 セル内で改行することができました。

 続いて、メッセージボックスでも改行してみます。

VBA

Sub test2()
	'変数a を宣言
	Dim a As String
	
	'vbCrLf で改行
	a = "aaa" & vbCrLf & "bbb"
	
	'メッセージボックスへ出力
	MsgBox a
End Sub

 メッセージボックスでも改行できました。

vbLf で改行

 VBAで、「vbLf」を使って、セルに値を入力してみます。

VBA

Sub test3()
	'変数a を宣言
	Dim a As String
	
	'vbLf で改行
	a = "aaa" & vbLf & "bbb"
	
	'セルに入力
	ActiveSheet.Cells(1, 1) = a
End Sub

 セル内で改行することができました。

 続いて、メッセージボックスでも改行してみます。

VBA

Sub test4()
	'変数a を宣言
	Dim a As String
	
	'vbLf で改行
	a = "aaa" & vbLf & "bbb"
	
	'メッセージボックスへ出力
	MsgBox a
End Sub

 メッセージボックスでも改行できました。

vbCr で改行

 VBAで、「vbCr」を使って、セルに値を入力してみます。

VBA

Sub test5()
	'変数a を宣言
	Dim a As String
	
	'vbCr で改行
	a = "aaa" & vbCr & "bbb"
	
	'セルに入力
	ActiveSheet.Cells(1, 1) = a
End Sub

 「vbCr」では、セル内の改行をすることができませんでした。

 続いて、メッセージボックスでも改行してみます。

VBA

Sub test6()
	'変数a を宣言
	Dim a As String
	
	'vbCr で改行
	a = "aaa" & vbCr & "bbb"
	
	'メッセージボックスへ出力
	MsgBox a
End Sub

 メッセージボックスでは改行できました。

vbCr + vbLf で vbCrLf となる

 「vbCr」と「vbLf」を組み合わせると「vbCrLf」となります。

 「vbCr」と「vbLf」を組み合わせて使ってセル内の改行をしてみます。

VBA

Sub test7()
	'変数a を宣言
	Dim a As String
	
	'vbCr と vbLf で改行
	a = "aaa" & vbCr & vbLf & "bbb"
	
	'セルに入力
	ActiveSheet.Cells(1, 1) = a
End Sub

 セル内で改行することができました。

 続いて、メッセージボックスでも改行してみます。

VBA

Sub test8()
	'変数a を宣言
	Dim a As String
	
	'vbCr と vbLf で改行
	a = "aaa" & vbCr & vbLf & "bbb"
	
	'メッセージボックスへ出力
	MsgBox a
End Sub

 メッセージボックスでも改行できました。

 「vbCr」と「vbLf」が「vbCrLf」と同じかを確認してみます。

VBA

Sub test9()
	'変数a と 変数b を宣言
	Dim a As String
	Dim b As String
	
	'変数a へ vbCr と vbLf を組み合わせて代入
	a = vbCr & vbLf
	'変数b へ vbCrLf を代入
	b = vbCrLf
	
	'変数a と 変数b が一致するか確認
	If a = b Then
		MsgBox "vbCr + vbLf と vbCrLf は一致します"
	End If
End Sub

 これにより vbCr と vbLf を組み合わせたものと、vbCrLfが同じものであることが確認できました。

セル内の改行コードを確認

 セル内で改行したときの改行コードを確認してみます。

 手入力をする際にセル内で改行したい場合は、「aaa」と入力後に「Alt + Enter」で改行し、続けて「bbb」と入力することでできます。

セル内の改行は vbLf

 セル内で改行した時の改行コードは「vbLf」となります。

 もちろん、改行コードは表示されないので見えませんから、VBAを使って確認してみます。

VBA

Sub test10()
	Dim a As String
	
	'セルの値を取得
	a = ActiveSheet.Cells(1, 1).Value
	
	'vbLfが含まれているかを確認
	If InStr(a, vbLf) > 0 Then
		MsgBox "vbLfが含まれています"
	End If
	
	'vbLfが含まれているかを確認
	If InStr(a, vbCr) > 0 Then
		MsgBox "vbCrが含まれています"
	End If
		
	'vbLfが含まれているかを確認
	If InStr(a, vbCrLf) > 0 Then
		MsgBox "vbCrLfが含まれています"
	End If
End Sub

 結果は「vbLfが含まれています」となりました。それ以外の「vbCr」や「vbCrLf」は含まれていません。なので、セル内の改行コードは「vbLf」となります。

VBAで改行を使う場合は vbLf がいい

 セル内で改行した場合は「vbLf」が入力されますので、VBAで改行を扱う場合は「vbLf」を使うと良さそうです。

 VBAで文字列を扱う場合や、メッセージボックス内で改行する場合に、とりあえず、改行コードは「vbLf」を使っておくという感じです。

テキストファイルの改行を確認

 Windowsのメモ帳で改行する場合の改行コードは「vbCrLf」となります。

 これにはちょっと注意が必要となります。

 エクセルで改行を使うときは、基本的に「vbLf」ですけれども、メモ帳などのテキストファイルでは「vbCrLf」が使われたりします。

テキストファイルの改行は vbCrLf

 メモ帳で改行したデータ(test.txt)を用意して、VBAで確認してみます。

 上図のメモ帳で作ったデータをエクセルに取り込んでみます。

VBA

Sub test11()
	'ファイルパスを設定
	Dim FilePath As String
	FilePath = ThisWorkbook.Path & "¥test.txt"
	
	'テキストファイルの値を取得
	With CreateObject("Scripting.FileSystemObject")
		With .GetFile(FilePath).OpenAsTextStream
			buf = .ReadAll
			.Close
		End With
	End With
	
	'セルに値を入力
	ActiveSheet.Cells(1, 1) = buf
End Sub

 改行された値を取得できましたが、見た目には改行コードの違いが分かりませんので、上記で使ったVBAを使って改行コードを確認してみます。

VBA

Sub test10()
	Dim a As String
	
	'セルの値を取得
	a = ActiveSheet.Cells(1, 1).Value
	
	'vbLfが含まれているかを確認
	If InStr(a, vbLf) > 0 Then
		MsgBox "vbLfが含まれています"
	End If
	
	'vbLfが含まれているかを確認
	If InStr(a, vbCr) > 0 Then
		MsgBox "vbCrが含まれています"
	End If
		
	'vbLfが含まれているかを確認
	If InStr(a, vbCrLf) > 0 Then
		MsgBox "vbCrLfが含まれています"
	End If
End Sub

 「vbLf」、「vbCr」、「vbCrLf」の全てが順番に表示されました。ということは、全ての改行コードを含んでる事を意味していますので、「vbLf」と「vbCr」を合わせて使うと「vbCrLf」になったことから考えても、この改行コードは「vbCrLf」であるということになります。

vbNewLineを使ってみる

 VBAで、「vbNewLine」を使って、セルに値を入力してみます。

VBA

Sub test12()
	'変数a を宣言
	Dim a As String
	
	'vbNewLine で改行
	a = "aaa" & vbNewLine & "bbb"
	
	'セルに入力
	ActiveSheet.Cells(1, 1) = a
End Sub

 セル内で改行することができました。

 続いて、メッセージボックスでも改行してみます。

VBA

Sub test13()
	'変数a を宣言
	Dim a As String
	
	'vbLf で改行
	a = "aaa" & vbNewLine & "bbb"
	
	'メッセージボックスへ出力
	MsgBox a
End Sub

 メッセージボックスでも改行できました。