適材適所

WindowsやPowerShellやネットワーク、IBMなどのシステム系の話やポイ活など気になったことも載せているブログです。

Excelのセル内改行コードはLFとCRLFのどちらでもいいのではないか説

この記事では

  • Excelのセル内の改行コードについて考察しています。
  • セル内の改行コードって本当はどうなの?と思っている人に向けて書いています。

セル内の改行コードはlf,crlfのどちらでもいけるのではないか説

私の中の常識では「セル内の改行コードはlfだ!」だったのですが、どうもそれだけとは限らないというお話です。

結論

【結論】セル内の改行コードは、「LFでもCRLFでも改行されて見えるのでどちらでもいい」!!

改行コードにはCR、LF、CRとLFを連続で書く、CRLFの3種類があります。

Excelのセル内でAlt+Enterを押すと、改行されます。

そのときに入力される改行コードはLFです。

しかし、実はセル内にどの改行コードを入れても、一見改行されたように見えます。

でも、よ~く見ると挙動が少し違っています。

LFとCRLFは正しく改行されます。

違うのはCR。

CRが入っているセルは「一度セルをアクティブにすると改行されて見える」という不思議な感じになります。

下の例では、それぞれ間に該当の改行コードが入っています。

f:id:shinmai_papa:20190822080514p:plain

CRが入っているA1セルをアクティブにしてみると・・・

f:id:shinmai_papa:20190822080517p:plain

うーん、不思議。

以下、詳しく検証してみました。

環境

Windows 10 pro 64bit
Excel 2019

経緯

とあるツールを作っていた際、セル内の改行コードに悩まされました。

「テキストから読み込んだ文字列を一度セルに転記した上で正規表現で置換する」というものです。

テキスト→セル→置換

テキストには改行コードCRLFが使われていました。

それをセルに転記した際も改行されていたんですね。

私の中ではセル内改行コード=LFだったので、そこで思考がストップしてしまいました。

「あ、もしかして、エクセルはCRLFの改行コードが入った文字列が書き込まれたら、勝手に変換してくれるのか!!」

そんな都合のいいように考えてました。

なんて愚かな自分。こんなことで一時間もハマることになるとも知らず・・・。

置換したい文の中にある改行コードを\sとして正規表現のパターンを作るも、置換されず。

※\sは正規表現で改行コードなどを表す一文字

「あれ、おかしい」

「セル内の改行コードはLFのはず。さすれば、改行文字1つでいいんじゃないの?」

他に問題があるのではないかとせっせと正規表現について復習するも解決せず。

最終的に改行コードに行きつき、セルに転記した時点では別に改行コードの変換なんて行われていない、ということがわかりました。

小さな実験

Excelのセル内で各改行コードがどのような挙動をするのか、そして改行コードとして何を使うのべきかなのか。

その検証のため、簡単な実験をやってみました。

準備

まず、CR,LF,CRLFのそれぞれの改行コードが入った、3つのテキストファイルを用意します。

sakuraだと、←がCR、↓がLF、↲がCRLFです。

f:id:shinmai_papa:20190822080510p:plain

そして、検証用にVBAのコードを用意しました。

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:\CR.txt")
   Cells(1, 1) = stm.ReadAll
   stm.Close
   'LF.txtをB1に転記
   Set stm = fso.OpenTextFile("C:\LF.txt")
   Cells(1, 2) = stm.ReadAll
   stm.Close
   'CRLF.txtをC1に転記
   Set stm = fso.OpenTextFile("C:\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

これを実行することで、各改行コードが入ったテキストファイルが改行コードを可視化してセルに書き込むことができます。

結果

f:id:shinmai_papa:20190822080520p:plain

A1~A3セルがテキストデータそのものです。

A1のCRは改行されていません。

A1をアクティブにすると改行されているようにみえます。

B1のLFは改行されています。

C1のCRLFは改行されています。

C1にはCRとLFの2つの改行コードがあるわけですが、アクティブにしても別に2回改行されるわけではありません。

この結果から、セル内の改行コードはCRLFでもいいということがわかりますね。

CRはパッと見、改行されているのがわかりにくいので使わない方がいいかも。

といっても今回の実験はあくまでプログラムを使って書き込む場合に限った話です。

普通にExcelを使う分には改行コードの種類が何かということを気にする場面は少ないかも知れません。

ちなみにCRやLFとは

CRやLFは制御コードの仲間です。

制御コードとは、表示装置(ディスプレイやプリンター)に紙を送ったり、逆に戻すなどの動作をさせるためのコードです。

制御コードで現在も使われている代表的なものにNULL、SPACE、TABなどがあります。

CRとは

CRとはCarriage Returnの略で、日本語では「復帰」と訳されます。

行頭に戻す、行を復帰させるといったところでしょうか。

旧式のタイプライターで紙を挟む部分のことをcarrigeと呼び、それを行頭まで移動させるという意味だそうです。

LF

LFとは、Line Feedの略です。日本語では「改行、行送り」と訳されます。

書き進む方向に紙を1行分送る、という意味だそうです。

ちなみにLINUXの改行コードはこれ1文字で改行を表します。

ややこしや。

終わりに

セル内の改行コードはCRLFでもいいというのは自分の中でちょっとした驚きでした。

なんでも常識に凝り固まっていてはだめという、いい教訓かも知れません。

普通にExcelを使っている分には全く気にならないですが、VBAなどプログラミングで扱うときは覚えておいて損はなさそうです。

というわけで、ここまでお読みいただき、ありがとうございました。