セル内の改行コードに注意


セル内で改行するには、改行したい位置でAlt+Enterキーを押します。

このとき、入力される改行コードは0A(LF)です。Windowsで使われている一般的な改行コードは0D 0A(CRLF)です。

次のようなコードで確認してみました。

Sub Sample1()
    Dim buf As String, dmp As String, i As Long
    buf = Range("B2").Text
    For i = 1 To LenB(buf)
        dmp = dmp & Hex(AscB(MidB(buf, i, 1))) & " "
    Next i
    MsgBox dmp
End Sub

Excelは文字データをUnicodeで管理しています。入力したそれぞれの文字に該当する文字コードは次の通りです。

田 : 0x7530
中 : 0x4E2D
1 : 0x0031
2 : 0x0032
3 : 0x0033

上位バイトと下位バイトがスワップしていますので、次のように記録されているのがわかります。

Excelの改行コードが0Aだけなのは昔からの仕様で、なぜそうなっているのか本当の理由はわかりません。ExcelはもともとMacintosh用に開発されたアプリだから・・・という話も聞きますが、本当のところはわかりません。理由はともあれ、Excelの改行コードは0Aだけだということです。

では、セル内の改行コードはどんなときも0Aだけかというと、実は違います。手動操作でAlt+Enterキーを押してセル内改行をした場合には、改行コードとして0Aだけが入力されますが、マクロなどでユーザーが明示的に0D 0Aの改行コードを使用した場合は、そのまま0D 0Aが保存されます。実際にやってみましょう。次のマクロで、セルB2に0D 0Aで改行したデータを入力してみます。

Sub Sample2()
    Dim buf As String, dmp As String, i As Long
    buf = "田中" & Chr(13) & Chr(10) & "123"    ''0D 0Aの改行コード
    Range("C2") = buf
    buf = Range("C2").Text
    For i = 1 To LenB(buf)
        dmp = dmp & Hex(AscB(MidB(buf, i, 1))) & " "
    Next i
    MsgBox dmp
End Sub

Alt+Enterキーで改行した場合とは違い、今度は「D 0 A 0」のように0D 0Aの改行コードが入力されているのがわかります。

0Aのみの改行コードが記録されることで、日記や日報などテキストを扱うケースでトラブルが生じる場合もあります。下図のような簡単な日報で試してみましょう。

[保存]ボタンをクリックすると、セルC4のデータをテキストファイル(C:\Data.txt)に保存します。[閲覧]ボタンをクリックすると、保存したテキストファイルの1行目だけを表示します。コードは次の通りです。

Sub ボタン1_Click()    ''[保存]ボタン
    Open "C:\Data.txt" For Output As #1
        Print #1, Range("C4")
    Close #1
End Sub

Sub ボタン2_Click()    ''[閲覧]ボタン
    Dim buf As String
    Open "C:\Data.txt" For Input As #1
        Line Input #1, buf
    Close #1
    buf = "※データの1行目" & vbCrLf & buf
    MsgBox buf
End Sub

特に難しくないコードです。ですが、実行結果は次の通り。

問題のC:\Data.txtをメモ帳で開いてみると、次のように表示されます。

Line Inputメソッドはファイルから1行分のデータを読み取る命令ですが、この「1行分」とは改行コード(0D 0A)までという意味です。Windowsの改行コードは0D 0Aですので、セル内に記録されていた改行コード0Aだけでは、改行されていると認識されないのです。

セル内の改行コード0Aを、Windowsの改行コード0D 0Aに置換して保存するには、次のようにします。

Sub ボタン1_Click()    ''[保存]ボタン
    Open "C:\Data.txt" For Output As #1
        Print #1, Replace(Range("C4"), vbLf, vbCrLf)
    Close #1
End Sub