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