適材適所

パソコン作業の自動化・効率化のための情報を発信するブログ(VBA,PowerShellなど)

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

この記事では

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

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

私の中の常識では「セル内の改行コードはlfだ」だったのですが、どうもそれだけとは限らないというお話です。 ※正規表現と改行コードについて出てきます。

結論

セル内の改行コードは、LFかCRLFなら改行されて見えます。
CRは一度セルをアクティブにすると改行されて見えるという不思議な感じになります。 下の例では、それぞれ間に該当の改行コードが入っています。
f:id:shinmai_papa:20190822080514p:plain

f:id:shinmai_papa:20190822080517p:plain
うーん、不思議。

環境

Windows 10 pro 64bit
Excel 2019

経緯

とあるツールを作っていた際、セル内の改行コードに悩まされました。 「テキストから読み込んだ文字列を一度セルに転記した上で正規表現で置換する」というものです。

テキスト→セル→置換

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

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

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

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

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

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

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

「あれ、おかしい」

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

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

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

小さな実験

さきほどの事象を確かめるため、簡単な実験をやってみました。 まず、CR,LF,CRLFの改行コードが入った、3つのテキストファイルを用意します。 sakuraだと、←がCR、↓がLF、↲がCRLFです。 f:id:shinmai_papa:20190822080510p:plain

こんなコードを用意しました。 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

実行結果 f:id:shinmai_papa:20190822080520p:plain

A1~A3がテキストデータそのものです。 A1のCRは改行されていません。 A1をアクティブにすると改行されているようにみえます。

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

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

この結果から、セル内の改行コードはCRLFでもいいということがわかりますね。
CRはパッと見、改行されているのがわかりにくいので使わない方がいいかも。

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

普通にエクセルを使う分には改行コードとかあまり気にする必要はありません。

最後に

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

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

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