姓と名をスペースでつなぐ、都道府県・市区町村・番地を1つの住所にする、取引先コードと枝番をハイフンでつないで照合用のキーを作る。Power Queryで複数の列を1列にまとめる方法は、主に3つあります。
- 画面操作の「列のマージ」
- カスタム列での
&演算子 - カスタム列での
Text.Combine関数
どれでも結合はできますが、数値の列やnull(空のセル)が混ざったときの動きが違います。ここを知らずに使うと、エラーになったり、一部の行だけ結果が空になったりします。
3つの方法の違い
| 方法 | 書き方の例 | nullがあると | 数値の列があると | 向いている場面 |
|---|---|---|---|---|
& 演算子 |
[姓] & " " & [名] |
結果全体がnullになる | エラーになる | 2〜3列を結合し、どの列にも必ず値がある |
Text.Combine |
Text.Combine({[姓], [名]}, " ") |
nullの値は飛ばされる | エラーになる(Text.From で文字列にする) |
列が多い、空欄がある、区切り文字を入れたい |
| 列のマージ | 列を選んで実行 | 生成される式による | 生成される式による | 一度だけの結合、画面操作で済ませたい |
&演算子で結合する
「列の追加」タブ →「カスタム列」で、次のように書きます。
= [姓] & " " & [名]
短く書けて読みやすいのが利点です。ただし、次の2つの場面でつまずきやすくなります。
数値の列を含めるとExpression.Errorになる
[商品コード] & "-" & [枝番] で、枝番の列が数値型になっていると、「演算子 & を Text 型と Number 型に適用できない」という趣旨の Expression.Error が出ます。& は、文字列どうしでなければ結合できないためです。
数値の列は、Text.From で文字列に変えてから結合します。
= [商品コード] & "-" & Text.From([枝番])
文字列に変える際は、見た目も確認してください。
- 先頭の0が必要な場合:数値の 7 は「7」になります。「007」のように桁をそろえたいなら、
Text.PadStart(Text.From([枝番]), 3, "0")とします。 - 日付の列:
Text.Fromの結果は地域設定に左右されます。形式を固定したいなら、Date.ToText([受注日], "yyyy-MM-dd")のように書式を指定します。 - 小数を含む金額:小数点以下の桁数が行によって変わることがあります。キーに使う場合は、何行か結果を見て、想定どおりの表記になっているか確かめます。
nullを含む行は結果が空になる
& では、どれか1つでもnullがあると、結果全体がnullになります。たとえば名の列が空の行では、[姓] & " " & [名] の結果は「山田 」ではなく、nullになります。
Excelのテーブルから読み込んだ空のセルは、nullとして扱われます。一部の行だけ結合の結果が空になっていたら、まずnullを疑ってください。
対処法は2つあります。
- 結合する前に、対象の列で「値の置換」を使い、
nullを空の文字列に置き換える - 次に説明する
Text.Combineで結合する
Text.Combineで区切り文字付きで結合する
Text.Combine は、文字列のリストを、指定した区切り文字でつないだ1つの文字列にします。
= Text.Combine({[姓], [名]}, " ")
= Text.Combine({[都道府県], [市区町村], [番地]}, "")
nullは飛ばされ、区切り文字も重ならない
Text.Combine は、リストの中のnullを無視して結合します。{"東京都", null, "1-2-3"} を「/」でつなぐと、結果は「東京都/1-2-3」です。結果全体がnullになることはなく、区切り文字が「//」と重なることもありません。空欄がある列の結合では、この性質が便利です。
空の文字列は飛ばされない
注意したいのは、null と空の文字列("")は別物だという点です。CSVから読み込んだ空欄は、nullではなく空の文字列になっていることがよくあります。空の文字列は飛ばされないので、「東京都//1-2-3」のように区切り文字が重なります。
空の文字列やスペースだけの値も除きたいときは、List.Select で残す値を絞ってから結合します。
= Text.Combine(
List.Select({[都道府県], [市区町村], [番地]}, each _ <> null and Text.Trim(_) <> ""),
"/"
)
数値が混ざるときはList.Transformで文字列にする
Text.Combine も、リストに数値が入っているとエラーになります。リストの値をまとめて Text.From で文字列に変えてから渡します。Text.From(null) はnullを返すので、nullが飛ばされる性質はそのまま残ります。
= Text.Combine(List.Transform({[取引先コード], [枝番]}, Text.From), "-")
数値・null・空の文字列をまとめて扱うなら、次の形にしておくと崩れにくくなります。
= Text.Combine(
List.Select(
List.Transform({[取引先コード], [枝番], [部署]}, Text.From),
each _ <> null and Text.Trim(_) <> ""
),
"-"
)
行のすべての列を結合する
カスタム列の中では、_ がその行全体(レコード)を表します。全列をカンマでつなぐなら、次のように書けます。
= Text.Combine(List.Transform(Record.FieldValues(_), Text.From), ",")
ただし、前のステップで列が増えたり、順番が変わったりすると、結果も変わります。照合キーなど、中身を固定したい用途では、列を明示して書くほうが安全です。
画面操作の「列のマージ」を使う場合
- 結合したい列を、つなぐ順番どおりにCtrlキーを押しながらクリックして選びます。
- 元の列を残したいなら「列の追加」タブ、元の列を1列に置き換えるなら「変換」タブの「列のマージ」を選びます。
- 区切り記号と新しい列名を指定して「OK」を押します。
生成される式は、Excelのバージョンや対象の列の型によって異なります。実行後に数式バーを見て、& と Text.Combine のどちらに近い式になっているか、数値の列を文字列に変えるステップが入っているかを確認してください。そのうえで、nullや空欄を含む行の結果も確かめます。
結合したあとに確認すること
- 行数が変わっていないか:列の結合で行数は変わりません。変わっていたら、ほかのステップを確認します。
- 結果がnullの行がないか:結合した列のフィルターを開き、「(null)」が一覧にあれば、その行の元の値を確認します。
- 区切り文字が重なった行や、先頭・末尾に区切り文字がある行がないか:テキストフィルターで「//」を含む行や、「/」で始まる行を探します。
- 先頭の0や日付の形式が崩れていないか:数値・日付の列から作った部分を、何行か目で確かめます。
- 照合キーに使うなら重複していないか:区切り文字なしで「1」と「23」を結合すると「123」になり、「12」と「3」を結合した結果と区別できません。キーにするときは、値に含まれない区切り文字を入れて結合し、重複がないことを確認してから使ってください。
