vbCrLf や vbLf が紹介されている。
これらの定数はどんな違いがあるのだろうか?
改行に関わる定数
定数 | 値(文字コード) | 内容 |
---|---|---|
vbCrLf | Chr(13) + Chr(10) | キャリッジ リターンとライン フィードの組み合わせ |
vbCr | Chr(13) | キャリッジ リターン文字 |
vbLf | Chr(10) | ライン フィード文字 |
vbNewLine | Chr(13) + Chr(10)。Macintosh の場合は、Chr(13) | プラットフォーム固有の改行文字。現在のプラットフォームに対応する文字が使用されます。 |
・キャリッジリターン・・・カーソルを文頭に戻す制御文字。正確には改行ではない。
・ラインフィード・・・カーソルを次の行の現在の行と同じ位置に移動する。
普通の感覚でいえば、上記のキャリッジリターンとラインフィードを組み合わせた挙動が改行のイメージではないだろうか。
つまり定数で言えば vbCrLFである。
定数による挙動の違い
定数 | セル | メッセージボックス | Debug.Print |
---|---|---|---|
vbCrLf | |||
vbCr | |||
vbLf | |||
vbNewLine | |||
Alt + Enterで改行 | ー | ー |
各定数がセルへの入力・メッセージボックスでの表示・Debug.Printでの表示でどのように挙動が変わるか調べてみた。
vbCrでセルへの入力以外はいずれも改行されて表示されている。
ということはvbCr以外の定数を使っておけば問題がないように見える。
そう、見た目は問題がないように見える。
文字コード
上記の5パターンそれぞれの文字コードを見てみる。
文字コードは便宜上1文字分毎にスペースを挿入している。
パターン | 文字コード |
---|---|
文字A & vbCrLf & 文字B | 65 13 10 66 |
文字A & vbCr & 文字B | 65 13 66 |
文字A & vbLf & 文字B | 65 10 66 |
文字A & vbNewLine & 文字B | 65 13 10 66 |
文字A & Alt + Enter改行 & 文字B | 65 10 66 |
1つ目のパターン65 13 10 16は下記のような意味である。
この表で見るとAlt + EnterはvbLfと同じであることがわかる。
ではこの5パターンが入力されたセルに対して置換で改行を消してみたい。
Excelの置換で改行を指定するには Ctrl + J とすることで入力できる。
では置換したあとの文字コードはどうなっているだろうか。
パターン(置換前) | セル | 文字コード(置換後) |
---|---|---|
文字A & vbCrLf & 文字B | 65 13 66 | |
文字A & vbCr & 文字B | 65 13 66 | |
文字A & vbLf & 文字B | 65 66 | |
文字A & vbNewLine & 文字B | 65 13 66 | |
文字A & Alt + Enter改行 & 文字B | 65 66 |
いづれのパターンも見た目は改行が消えて思った通りの挙動をしているように見えるが、置換後の文字コードを見てみると、見た目には何も見えないがキャリッジリターンが消えずに残っている。
この状態でそれぞれのパターンから2文字目を抽出してみる。
パターン | 2文字目 |
---|---|
文字A & vbCrLf & 文字B | |
文字A & vbCr & 文字B | |
文字A & vbLf & 文字B | B |
文字A & vbNewLine & 文字B | |
文字A & Alt + Enter改行 & 文字B | B |
キャリッジリターンを含むパターンが空白なのは、抽出できていなのではなく文字コード13のキャリッジリターンを抽出している。
このことからセルに改行を書き込む際は vbLfを使うとAlt + Enterとの整合性が取れて上手く文字処理ができないということが減るのではないでしょうか。
まとめ
以上の検証からするとExcel VBAで使用する改行は vbLf の一択になりそうだが、vbCrLfが紹介されていることが多いのはなぜだろうか。
vbNewLineで表示されるのがvbCrLfであるようにWindowsのデフォルトがvbCrLfだからトラブル回避になるのだろうか。
取り敢えずセルへの書き込みは vbLf、VBAでは vbCrLF を使用すれば良いでしょう。