Excel VBA
この記事では「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.
改行コード
改行コードとは何か
- 文字の一区切りを示す不可視文字
- OSやアプリごとに「どの文字を使って改行とみなすか」が決まっている
- Excel 画面上の「セル内改行」(Alt + Enter)と、VBAコードで扱う改行は 同一の概念 だが、入力方法・保存方法・エクスポート時の挙動が異なる
覚えどころ
- 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)など他の国際化情報も取得できるので併用推奨
なぜこんなに種類があるの?
- レガシー互換
- 古いMacやUNIXとの相互運用を壊さないため
- 移植性
- Access/VB6など他のVB系プロジェクトとコードを共有しやすくするため
- パフォーマンス
- Chr$系は速度最優先の書き方ができ、大量テキスト処理で有利
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
メッセージボックスでも改行できました。






