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

  1. Home
  2. Excel
  3. VBA
  4. Excel VBA Tips

セル内で改行するには、改行したい位置で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

(追記) (追記ここまで)

AltStyle によって変換されたページ (->オリジナル) /