この記事では
- Excelのセル内の改行コードについて考察しています。
- セル内の改行コードって本当はどうなの?と思っている人に向けて書いています。
セル内の改行コードはlf,crlfのどちらでもいけるのではないか説
私の中の常識では「セル内の改行コードはlfだ」だったのですが、どうもそれだけとは限らないというお話です。
結論
セル内の改行コードは、LFかCRLFなら改行されて見えます。
CRは一度セルをアクティブにすると改行されて見えるという不思議な感じになります。
下の例では、それぞれ間に該当の改行コードが入っています。
CRが入っているA1セルをアクティブにしてみると・・・
うーん、不思議。
環境
Windows 10 pro 64bit
Excel 2019
経緯
とあるツールを作っていた際、セル内の改行コードに悩まされました。
「テキストから読み込んだ文字列を一度セルに転記した上で正規表現で置換する」というものです。
テキスト→セル→置換
テキストには改行コードCRLFが使われていました。
それをセルに転記した際も改行されていたんですね。
私の中ではセル内改行コード=CRだったので、そこで思考がストップしてしまいました。
「あ、もしかして、エクセルはCRLFの改行コードが入った文字列が書き込まれたら、勝手に変換してくれるのか!!」
そんな都合のいいように考えてました。
なんて愚かな自分。こんなことで一時間もハマることになるとも知らず・・・。
置換したい文の中にある改行コードを\sとして正規表現のパターンを作るも、置換されず。
※\sは正規表現で改行コードなどを表す一文字
「あれ、おかしい」
「セル内の改行コードはLFのはず。さすれば、改行文字1つでいいんじゃないの?」
他に問題があるのではないかとせっせと正規表現について復習するも解決せず。
最終的に改行コードに行きつき、セルに転記した時点では別に改行コードの変換なんて行われていない、ということがわかりました。
小さな実験
さきほどの事象を確かめるため、簡単な実験をやってみました。
まず、CR,LF,CRLFの改行コードが入った、3つのテキストファイルを用意します。
sakuraだと、←がCR、↓がLF、↲がCRLFです。
こんなコードを用意しました。 3つのテキストファイルをエクセルに転記し、改行コードを文字列に置き換えて見えるようにしてみます。
'参照設定 Microsoft Scripting Runtime Sub test() Dim fso As FileSystemObject: Set fso = New FileSystemObject Dim stm As TextStream 'CR.txtをA1に転記 Set stm = fso.OpenTextFile("C:\Users\USER\Desktop\CR.txt") Cells(1, 1) = stm.ReadAll stm.Close 'LF.txtをB1に転記 Set stm = fso.OpenTextFile("C:\Users\USER\Desktop\LF.txt") Cells(1, 2) = stm.ReadAll stm.Close 'CRLF.txtをC1に転記 Set stm = fso.OpenTextFile("C:\Users\USER\Desktop\CRLF.txt") Cells(1, 3) = stm.ReadAll stm.Close 'cr、lfを見えるようにしてA2~C2へ書き込む Dim i As Long For i = 1 To 3 Cells(2, i) = Replace(Cells(1, i), vbCr, "<<vbcr>>") Next i For i = 1 To 3 Cells(2, i) = Replace(Cells(2, i), vbLf, "<<vblf>>") Next i End Sub
実行結果
A1~A3がテキストデータそのものです。 A1のCRは改行されていません。 A1をアクティブにすると改行されているようにみえます。
B1のLFは改行されています。
C1のCRLFは改行されています。 C1にはCRとLFの2つの改行コードがあるわけですが、アクティブにしても別に2回改行されるわけではありません。
この結果から、セル内の改行コードはCRLFでもいいということがわかりますね。
CRはパッと見、改行されているのがわかりにくいので使わない方がいいかも。
といっても今回の実験はあくまでプログラムを使って書き込む場合に限った話です。
普通にエクセルを使う分には改行コードとかあまり気にする必要はありません。
ちなみにCRやLFとは
CRやLFは制御コードの仲間です。
制御コードとは、表示装置(ディスプレイやプリンター)に紙を送ったり、逆に戻すなどの動作をさせるためのコードです。
他に代表的なものにNULL、SPACE、TABなどがあります。
制御コードについてについてはこちらがほどほどに詳しいです。
CRとは
CRとはCarriage Returnの略で、日本語では「復帰」と訳されます。
行頭に戻す、行を復帰させるといったところでしょうか。
旧式のタイプライターで紙を挟む部分のことをcarrigeと呼び、それを行頭まで移動させるという意味だそうです。
LF
LFとは、Line Feedの略です。日本語では「改行、行送り」と訳されます。
書き進む方向に紙を1行分送る、という意味だそうです。
ちなみにLINUXの改行コードはこれ1文字で改行を表します。
ややこしや。
最後に
セル内の改行コードはCRLFでもいいというのは自分の中でちょっとした驚きでした。
なんでも常識に凝り固まっていてはだめという、いい教訓かも知れません。
ここまでお読みいただき、ありがとうございました。
関連ありそうな他の記事
ADODB.Streamでゴミデータ(Null文字)がある場合の挙動について - 適材適所
Excel VBAでマクロからの変更のみ許可しているシートでマクロによるHyperLinkの削除ができない件 - 適材適所