基本から応用まで!Power Queryの「値の置換」を使いこなそう

Excel

先輩、大変です…!今朝、取引先から「商品コードが新しくなったので、データ全部を更新してください」って言われてて…!手で直すのつらすぎます…

落ち着いて。Power Queryの「値の置換」を使えば一括で置き換えられるよ。しかも、一回設定すれば次からも自動で変えられるから大丈夫。

Power Query(パワークエリ)でデータを整理するときに、よく登場するのが「値の置換」機能です。

たとえば――

  • 商品の単価が変更されたから、古い金額を新しい金額に置き換えたい
  • 組織改編で「第一営業部」が「営業本部」に名称変更されたので、全部まとめて修正したい
  • 「A」「B」「C」の細かい分類を「カテゴリ1」「カテゴリ2」に再分類したい

こんな場面は日々の業務でもけっこう多くないでしょうか?

もちろん、Excel上で一つひとつ手作業で置換してもできますが、量が多いとミスも出やすいし、何より面倒で時間がかかります

そんなときこそ、Power Queryの「値の置換」機能が大活躍!

基本の使い方はとってもシンプル。でも、少しステップアップすると条件付きの置換や複数条件の置換など、柔軟な処理もできるんです。

Power Queryの「値の置換」を基本から応用までしっかり解説していきます!

まずはここから!「値の置換」の基本の使い方

Power Queryを使うなら、この機能は絶対覚えておきたい!

そんな基本中の基本が――「値の置換」です。

「値の置換」は、とてもシンプルで使いやすい、そして本当に出番が多い機能です。

操作方法は以下の通りです。

  1. 置換したい列を選択
    置換したい値が含まれている列をクリックします。
  2. 右クリック →「値の置換」を選択
    列の上で右クリックし、表示されたメニューから「値の置換」を選びます。

メニューの「変換」→「値の置換」を選んでもOK。

  1. 置換前と置換後の値を入力
    「検索する値」と「置換後の値」を入力して、「OK」をクリックする!

値が一括で変更されました。


ちょっと注意!部分一致で置換される

次は、「商品」列の「もも」ってひらがなを漢字の「桃」に置き換えてみましょう!

結果はどうでしょう。

「すもも」まで置換されて「す桃」になってしまいました!

これは、「もも」って文字が含まれていれば置換っていう“部分一致”で探しに行っちゃうからなんです。

そんなときは「値の置換」の「詳細設定オプション」を使います。

「詳細設定オプション」を開くと、「セルの内容の照合」っていう項目が出てくるので、そこにチェックを入れます。

これで、「もも」だけをちゃんと「桃」に置き換えられます。

応用編!条件付き・複数条件の置換は「詳細エディター」を使おう

「値の置換」で文字の置換はサクッと直せるようになったけど、もっと細かく「この条件のときだけ置き換えたい!」ってこと、ありませんか?

たとえば…

  • 日付が2024年以前なら「旧」、それ以降なら「新」と分けたい
  • 「部門」が「営業」かつ「ステータス」が「未対応」のときだけフラグを立てたい
  • 特定の期間だけ単価を1割引きに計算して置換したい

こういった条件付きの置換は、残念ながら「値の置換」機能だけでは対応できません。

そんなときに登場するのが、Power Queryの「詳細エディター」です!

メニューの「ホーム」→「詳細エディター」で開きます。

詳細エディターは、Power Queryの“中身”をじかにいじれる編集画面です。

「詳細エディター」や条件の書き方はこちらの記事も参考にしてください。

置換する部分はこのような記述になっています。

Table.ReplaceValue(
    対象のデータ(テーブル),
    検索する値,
    置き換える値,
    Replacer.種類,
    対象列リスト
)

「株式会社モフ」を「株式会社モフホールディング」に置換した部分を見てみましょう。

置き換えられた値1 = Table.ReplaceValue(
    並べ替えられた行,
    "株式会社モフ",
    "株式会社モフホールディング",
    Replacer.ReplaceText,
    {"取引先"}
),

使ってるのは Table.ReplaceValue っていう関数で、ポイントはこのあたり

  • 並べ替えられた行:前のステップ(並べ替えたテーブル)からデータを引き継ぎます
  • “株式会社モフ” → “株式会社モフホールディング”
    この部分が置換対象と置換後の文字
  • Replacer.ReplaceText:文字を置き換えるよっていう指定
  • {“取引先”}:どの列を置換するか。今回は「取引先」を置換します。

その下の行では、「商品」列にある「もも」っていう文字を「桃」に置き換えています。

置き換えられた値2 = Table.ReplaceValue(
    置き換えられた値1,
    "もも",
    "桃",
    Replacer.ReplaceValue,
    {"商品"}
)

ポイントはここ

  • 置き換えられた値1:さっきのステップ(「株式会社モフ」を置換したやつ)を引き継ぐ
  • “もも” → “桃”:この文字列を置き換える設定
  • Replacer.ReplaceValue:こちらは完全一致での置換をします
  • {“商品”}:今回は「商品」列を置換対象にしています

さっきの Replacer.ReplaceText は「部分一致(含まれてたらOK)」だったけど、今回の Replacer.ReplaceValue は「完全一致じゃないと置換しない」のがポイント!

さて、次に条件で置換したいときは ifを使います。

if [列名] = 条件 then 値1 else 値2

例えば

if [商品] = "もも" then "桃" else [商品]

これは「商品」列が「もも」だったら「桃」に置き換える、そうじゃなかったら元の値のままって意味になります。

さて、それでは実際に置換してみます。

置き換えられた値3 = Table.ReplaceValue(
    置き換えられた値2,
    each [取引先],
    each if [取引先] = "株式会社モフホールディング"  then "株式会社モフHD" else [取引先],
    Replacer.ReplaceValue,
    {"取引先"}
)

「取引先」列を見て、「株式会社モフホールディング」って書いてあるセルだけ 「株式会社モフHD」に置き換える!それ以外はそのまま!という意味になります。

  • each [取引先]:いま見てる行の「取引先」の値を取ってくるよって意味
  • if [取引先] = “株式会社モフホールディング”
    もしこの行の「取引先」が“株式会社モフホールディング”だったら…
  • then “株式会社モフHD” else [取引先]
    条件に合う場合は「“株式会社モフHD”に変えるよ」、そうじゃなかったら「そのままの値にしとくよ」
  • Replacer.ReplaceValue:完全一致で置換するルールを使うよ、って指定
  • {“取引先”}:対象にする列は「取引先」列だよ、って意味

ちゃんと置換されました。

ワンポイント

書き方のちょっとしたポイントを押さえておきましょう。

置き換えられた値3 = Table.ReplaceValue(
    置き換えられた値2,
    each [取引先],
    each if [取引先] = "株式会社モフホールディング"  then "株式会社モフHD" else [取引先],
    Replacer.ReplaceValue,
    {"取引先"}
)

この「each」は「今見てる行(または値)を参照するよ!」っていう合図です。

each [取引先]と書けば「今見てる行の中の『取引先』列の値を取ってきてね〜」という意味になります。

列の値を参照するときは列名を[](角括弧)で囲みます。

if 文は条件を2つ以上組み合わせたり(andやorを使う)、入れ子(ネスト)も使えます。

また、置換する値には計算結果や関数(M関数)も使えます。

  • each [金額] * 1.1
    消費税10%を加算するみたいな処理。今見てる金額に対して掛け算する!
  • each Text.Upper([商品名])
    商品名を全部大文字に変換する。

なお、複数条件の場合に次のような書き方もできますが、

置き換えられた値3 = Table.ReplaceValue(
    置き換えられた値2,
    "ルナ",
    each if [日付] >= #date(2024, 2, 1)  then "ルナ社" else [取引先],
    Replacer.ReplaceText,
    {"取引先"}
)

{“取引先”}に”ルナ”が含まれている場合で[日付]が2024/2/1以降の場合に、その値の部分を”ルナ社”に置き換えて、それ以外はそのままの値にするよっという意味になりますが、ちょっと分かりにくいですよね。

置き換えられた値3 = Table.ReplaceValue(
    置き換えられた値2,
    each [取引先],
    each if [取引先] = "合同会社ルナ" and [日付] >= #date(2024, 2, 1) then "合同会社ルナ社" else [取引先],
    Replacer.ReplaceValue,
    {"取引先"}
)

{“取引先”}の値をすべてチェックして、[取引先]が”合同会社ルナ”かつ[日付]が2024/2/1以降の場合に、その値を”合同会社ルナ社”に置き換えて、それ以外はそのままの値にするよっという意味になります。

結果は同じですが、こっちの方が分かりやすいんじゃないでしょうか。

条件で部分一致を使いたいときは、Text.Contains([取引先], "ルナ") って書き方もあるので、参考にしてみてくださいね!

if Text.Contains([取引先], "ルナ") and [日付] >= #date(2024, 2, 1) then "合同会社ルナ社" else [取引先]

[取引先]に”ルナ”が含まれていて[日付]が2024/2/1以降の場合に、その値を”合同会社ルナ社”に置き換えて、それ以外はそのままの値にするよっとなります。

まとめ

今回は「値の置換」について、基本的な使い方から詳細エディターを使った応用まで解説しました。

複数の条件を組み合わせたり、他の列の値を使って置換したりすることで、複雑なデータの処理も可能になります。

これにより、データ整理がより柔軟に、効率的にできるようになります。

基本から応用までの知識を身につけることで、今まで手作業で時間がかかっていた作業を、もっとスムーズにこなせるようになるので、ぜひ活用してみてくださいね!

これならデータ整理がどんどん楽になりそう!いろんな条件に対応できるなんて、めっちゃ便利で、ますます楽しくなってきました!