VBAで扱う「改行」という言葉には2つの意味がある
VBAで「改行」というと、2つの意味で使われます。
- String型の文字列の改行コード(改行文字)のこと(当ページではこちらを主に説明)
- VBAのソースコードの行を途中で改行する書き方のこと
このページでは主に前者について説明しますが、後者のソースコードの途中での改行は話が簡単なのでここで説明します。
ソースコードの途中で改行したい場合は、以下のように改行したい部分で半角スペース1文字とアンダーバーを入力するとコードの途中で改行して書くことができます。注意点として、アンダーバーの右には何も記述できません。コメントも記述できません。
1 2 3 4 5 6 7 8 9 |
Sub SrcLineFeed() Dim str As String str = "aaa" & _ "bbb" & _ "ccc" Debug.Print str End Sub |
実行結果
aaabbbccc
ソースの改行方法は以上です。
以降はVBAの文字列で扱う改行のことについて説明します。なお、以降の説明では「改行コード」と統一して記述します。
改行コードとは
改行コードとは文字の1種です。改行コードは改行文字とも言いますが同じ意味で使われます。
改行コードにはCR(Carriage Return)とLF(Line Feed)の2つがあり、また、CRとLFを組み合わせた2バイトで1つの改行とみなす「CRLF」もあります。VBAに限らずWindowsでは改行というとCRLFのことを指します。
CRとLFのどちらも「ここで改行しますよ」ということを示す文字のことを言います。CRとLFの2つがあるのにはタイプライター時代の経緯からきていますが今では当時の意味は使われておらず、用途によって使い分けをします。それについては後述します。
VBAでは文字列を扱うString型の変数には、英字、数字、ひらがな、かたかな、漢字などの文章で扱う文字はもちろん設定できますが、以下のように改行コードも含めることができます。
1 2 3 |
s = "a" & vbCr '// CR s = "b" & vbLf '// LF s = "c" & vbCrLf '// CRLF |
文章で扱う文字は当然目に見えますが、改行コード自体は目に見える文字ではないため文章としては表示されません。このような特別な動作をする文字のことを「制御文字」と言います。
テキストエディタでは行末にEnterキーに印字された矢印マークが表示されることがありますが、それが改行コードに当たります。このようなマークはエディタによって異なるとは思いますが、サクラエディタの場合は左矢印はCR、下矢印はLF、Enterキー矢印はCRLF、になっているようです。
制御文字にはASCIIコードでは33個ありますが、実際で使うのはそのうちの「NULL(空を示す)」「LF(Line Feed)」「CR(Carriage Return)」ぐらいです。
他の制御文字は通信データやバイナリデータなど、一般的に難易度が高くなりやすいプログラムを扱うときでないと利用することないでしょう。そのため、セルの文字列やテキストファイルを扱う場合に制御文字を使うことはまずありません。
VBAで扱える改行コードと定数
VBAでは改行コードの定数が4つ用意されています。
定数 | 改行コード | 文字数 | 10進数値 (16進数値) |
正規表現 | 内容 |
---|---|---|---|---|---|
vbCrLf | CRLF | 2 | 10 (0A) + 13 (0D) | \r\n | WindowsOSでの改行コード。MsgBox関数の文字列の改行にも利用する。 |
vbCr | CR | 1 | 13 (0D) | \r | MacOS9(古いMac)まででの改行コード。 |
vbLf | LF | 1 | 10 (0A) | \n | MacOSX/OS X(現行Mac)/Unix/Linuxでの改行コード。セル内改行にも利用する。 |
vbNewLine | OSによって異なる。Windows:vbCrLfと同じ、Mac:vbCrと同じ |
vbNewLineは使っているOSに合わせて改行コードを切り替えてくれる定数で、Windowsの場合は正しくCRLFとして扱われますが、MacOSXの場合は本来Unix系のためLFとして扱われるべきですがCRとして扱われます。これは過去のMacのOS9などのときがCRだったため、その名残だと思われますが、結果的には正しく変換されません。
Excelで扱う改行コードは使い分けが必要
Excelでは状況に応じて改行コードの使い分けが必要になります。
使い分けには3つあります。
- テキストファイルへの書き込みはCRLFが利用されます。
- Excelのセル内の改行にはLFが利用されます。
- Excelのメッセージボックスのメッセージの改行にはCRLFが利用されます。
これらについて以下に詳細を説明します。
1. テキストファイルの改行はCRLFを使う
VBAには主に2つの方法でテキストファイルの読み書きができます。
1つはOpenステートメントでファイルを開く方法で、もう1つがFileSystemObjectクラスを利用する方法です。それぞれについての詳細は以下をご参照ください。
・Openステートメント ― VBAでテキストファイルの読み書きを行う
・FileSystemObjectクラス ― VBAでのFileSystemObjectとTextStreamの使い方
これらのファイル操作を行う仕組みを使った場合、ファイル行の書き込み時に自動でWindowsの改行コードであるCRLFを付与してくれる関数が用意されています。
Openステートメントでファイルを開いた場合はLine Input、Input、Print、Writeステートメント、FileSystemObjectクラスを利用した場合はReadLine、WriteLineメソッドは改行コードのCRLFを自動的に読み書きできるようになっています。
これらのCRLFの付与は自動的に行われるため多くの場合は改行コードがCRLFかどうかを気にする必要はないですが、WindowsではなくMacやLinux用のテキストファイルを扱う場合は改行コードがLFのため、特に書き込み時には改行コードが適切かどうか注意が必要になります。
2. セル内改行はLFを使う
セル内の改行はLF(vbLf)で表現されます。これはExcelの仕様です。
Excel操作でセル内の改行を行う場合はAltキーを押しながらEnterキーを押します。
このときに追加された改行コードはLFが設定されています。以下のコードは上記A1セルの内容をイミディエイトウィンドウに出力する関数です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Sub GetCellLF() Dim s As String '// セル文字列 Dim h As String '// 1文字 '// セル値を取得 s = Range("A1").Value Dim i As Integer: i = 0 '// ループカウンタ '// 文字列長ループ For i = 0 To Len(s) - 1 '// 1文字取得 h = Mid(s, i + 1, 1) '// 文字と16進数を出力 Debug.Print h & " 16進数:" & Hex(Asc(h)) Next End Sub |
実行結果
イミディエイトウィンドウに、セルの文字とそのASCIIコード値を出力するようにしていますが、改行部分は文字が表示されない代わりにイミディエイトウィンドウで改行されています。
また、対象セルのRangeオブジェクトのValueプロパティにLFを含んだ文字列を設定すると、セル内でLFの部分が改行されて出力されます。以下を実行するとA1セル内で改行して出力されます。
1 2 3 |
Sub SetCellLF() Range("A1").Value = "aa" & vbLf & "bb" & vbLf & "cc" End Sub |
ちなみに、セルの値にLFではなくCRを設定した場合、セルの見た目は改行されません。ただし、文字としてはCRは存在しているため、例えば「”a” & vbCr」としている場合は見た目は「a」と1文字表示されているように見えますが、「Len(Range(“A1”).Value)」のように文字列長を取得するとCRも含めて2が返されます。
3. MsgBoxの改行はCRLFを使う
メッセージボックスの文章を改行させる場合はCRLF(vbCrLf)を使います。CR(vbCr)やLF(vbLf)でも改行はされますが、一般的な方法ではないためお勧めしません。
1 2 3 4 5 6 7 |
Sub MsgBoxLF() Dim s As String '// 出力文字列 s = "aa" & vbCrLf & "bb" & vbCrLf & "cc" Call MsgBox(s, vbOKOnly) End Sub |
なお、Macの場合はLFを使います。Windowsの場合と同様にCRとLFの両方が使えますが、MacでCRLF(vbCrLf)を使った場合は改行が2つ入ります。もしWindowsとMacの共用を行う場合はvbNewLine定数を使うと、どちらの場合も改行が1行分になります。