ゴールのイメージをそろえる
今回のテーマは「Power Query で セル内に紛れ込んだ改行コード(折り返し)をきれいに削除する実務テンプレ」です。
Excel で「セル内改行(Alt+Enter)」が入っているデータや、
外部システムからの出力で \r\n(CRLF)などが混ざっているデータを想定します。
やりたいことはシンプルです。
見た目は同じなのに、改行が混ざっていて JOIN・集計・検索がズレる問題を防ぐ。
「改行は全部消す」か「改行をスペースに置き換える」かをルール化して、一括で処理できるようにする。
まず「改行コード」の正体をおさえる
Excel のセル内改行と Power Query の改行
Excel で Alt+Enter で入る「セル内改行」は、
Power Query では 改行文字(LF = #(lf))や CRLF(#(cr)#(lf)) として扱われます。
代表的な改行コードは次の3つです。
#(lf)… Line Feed(LF, コード 10)#(cr)… Carriage Return(CR, コード 13)#(cr)#(lf)… Windows でよくある CRLF の組み合わせ
実務的には「とにかく改行っぽいものは全部消す or スペースにする」という方針で十分です。
例題の前提データをイメージする
例えば、こんなテーブルを想像してください。
| 顧客コード | 顧客名 | 備考 |
|---|---|---|
| A001 | 田中太郎 | “東京本社\r\n1階受付” |
| A002 | “山田\r\n花子” | “” |
| A003 | 佐藤次郎 | “VIP\r\n要事前連絡” |
見た目では「セル内改行されているだけ」に見えますが、
Power Query 的には「文字列の途中に改行コードが入っている」状態です。
これを、例えば次のようにしたいとします。
- 改行を削除して、単純にくっつける
"東京本社1階受付","山田花子","VIP要事前連絡"
- もしくは、改行をスペースに置き換える
"東京本社 1階受付","山田 花子","VIP 要事前連絡"
どちらを採用するかは業務次第ですが、やり方はほぼ同じです。
基本テンプレ:1列の改行コードを削除する
顧客名列から改行を削除するシンプル版
まずは「顧客名」列だけを対象に、
改行コード(CR, LF, CRLF)を削除するテンプレです。
let
Source = ・・・前のステップ・・・,
Cleaned =
Table.TransformColumns(
Source,
{
{
"顧客名",
each
let
t = Text.From(_),
noCR = Text.Replace(t, "#(cr)", ""),
noLF = Text.Replace(noCR, "#(lf)", "")
in
noLF,
type text
}
}
)
in
Cleaned
Power Queryやっていることを言葉で整理するとこうです。
Text.From(_)で値を文字列として扱うText.Replace(t, "#(cr)", "")で CR を削除- さらに
Text.Replace(..., "#(lf)", "")で LF も削除 - 結果として、改行コードがすべて消えた文字列になる
これで "山田\r\n花子" は "山田花子" になります。
応用:改行を「削除」ではなく「スペースに置き換える」
見た目の区切りを残したい場合
「山田花子」をくっつけるのではなく、「山田 花子」のようにスペースで区切りたい場合は、
削除ではなく置き換えにします。
let
Source = ・・・前のステップ・・・,
Cleaned =
Table.TransformColumns(
Source,
{
{
"顧客名",
each
let
t = Text.From(_),
replCR = Text.Replace(t, "#(cr)", " "),
replLF = Text.Replace(replCR, "#(lf)", " "),
trimmed = Text.Trim(replLF)
in
trimmed,
type text
}
}
)
in
Cleaned
Power Queryポイントは次の通りです。
- CR と LF をスペース
" "に置き換える - 最後に
Text.Trimで前後の余計なスペースを削る
これで "山田\r\n花子" → "山田 花子" のように、
「改行の位置にスペースを残したままフラットな文字列」にできます。
実務向け:全ての文字列列から改行コードを削除する
「どの列に改行が紛れているか分からない」ケース
列が多い、どこに改行が入っているか分からない、という場合は、
「文字列型の列を自動で拾って、全部に“改行削除”をかける」テンプレが便利です。
まずは「改行削除専用の関数」を一つ作っておくと、再利用しやすくなります。
改行削除関数を作る
// クエリ名:fn_RemoveNewLine
let
RemoveNewLine = (text as nullable text) as nullable text =>
let
t =
if text = null then
null
else
Text.From(text),
noCR =
if t = null then
null
else
Text.Replace(t, "#(cr)", ""),
noLF =
if noCR = null then
null
else
Text.Replace(noCR, "#(lf)", "")
in
noLF
in
RemoveNewLine
Power Queryこれで、fn_RemoveNewLine("山田#(cr)#(lf)花子") は "山田花子" を返します。
全テキスト列に一括適用するクエリ
let
Source = ・・・前のステップ・・・,
// 1) 文字列型の列名だけを取得
TextColumns =
List.Select(
Table.ColumnNames(Source),
(colName) =>
Value.Type(Source[colName]) = type text
),
// 2) 各文字列列に fn_RemoveNewLine を適用する変換リストを作成
TransformList =
List.Transform(
TextColumns,
(colName) =>
{colName, fn_RemoveNewLine, type nullable text}
),
// 3) 一括変換
Cleaned =
Table.TransformColumns(
Source,
TransformList
)
in
Cleaned
Power Queryこれで、「文字列型の列に紛れ込んだ改行コード」は、
どの列にあっても一括で削除されます。
重要ポイントの深掘り
改行削除は「前処理のかなり早い段階」でやる
改行が残ったままだと、次のような問題が起きます。
- JOIN キーとして使うと、一部だけ結合されない
- GROUP BY や DISTINCT で、見た目同じなのに別グループ扱いになる
- エクスポートした CSV を他システムに渡したとき、行がズレる・壊れる
なので、「トリム(前後空白除去)」「全角→半角」「不正文字除去」と同じく、
クレンジングのかなり早い段階で“改行削除”を入れておくのが鉄則です。
「削除」か「スペース置換」かは列ごとに決める
改行をどう扱うかは、列の意味によって変えるのが実務的です。
- 氏名・コード系:改行は完全に不要 → 削除で OK
- 備考・コメント系:改行位置の区切りは残したい → スペースに置換が無難
なので、
「氏名・コード列には fn_RemoveNewLine(削除)」
「備考列には“改行→スペース+Trim”版の関数」
というように、列ごとにルールを分けるのがきれいです。
実務テンプレとしてのまとめ
「改行コード削除」の本質は、たった一言です。
“セル内改行は、JOIN・集計・エクスポートで確実に悪さをするので、前処理で必ずフラットな文字列にしておく”
そのための型はこうでした。
Text.Replace(..., "#(cr)", ...)とText.Replace(..., "#(lf)", ...)で CR / LF を処理する- 削除するか、スペースに置き換えるかを列ごとに決める
- 関数化しておき、対象列または全テキスト列に
Table.TransformColumnsで一括適用する

