[How To] Excel Power Query :多列資料歸戶教學

如果你的 Excel 資料裡,同一個配方代號會對應到多筆不同的保健食品原料,而你想把這些原料整理成一列,並且用逗號串接起來,那麼用 Power Query 會比公式更適合。這篇文章用一組完全虛構的保健食品假資料示範,教你如何把同一個配方代號下的多筆原料做資料歸戶,整理成一筆配方內容,並且自動去除重複值。

一、建立假資料:保健食品配方範例

先在 Excel 建立一張工作表,名稱可以叫做「保健配方來源」。欄位名稱這次改成完全不同的假欄位:

  • 配方代號
  • 保健食品原料

範例假資料如下:

配方代號 保健食品原料
H001維生素C
H001
H001蜂膠
H001維生素C
H002魚油
H002維生素E
H003葉黃素
H003玉米黃素
H003維生素A
H004益生菌
H004果寡糖
H004菊糖
H005膠原蛋白
H005玻尿酸
H005維生素C
H006
H006維生素D3
H006

這裡故意把 H001 的維生素C重複出現兩次,是為了示範 Power Query 如何在整理時自動去重複。

二、整理後想得到的結果

我們想把同一個「配方代號」底下的多筆「保健食品原料」,整理成一列,並用逗號加空格串接。整理後的結果會像這樣:

配方代號 配方內容
H001維生素C, 鋅, 蜂膠
H002魚油, 維生素E
H003葉黃素, 玉米黃素, 維生素A
H004益生菌, 果寡糖, 菊糖
H005膠原蛋白, 玻尿酸, 維生素C
H006鎂, 維生素D3, 鈣

也就是說,Power Query 要幫我們完成三件事:先依配方代號做分組,再抓出同組內的所有原料,最後把重複值去掉並串成一格。

三、先把 Excel 資料轉成表格

在 Power Query 讀資料之前,建議先把來源資料轉成 Excel 表格。做法如下:

  1. 選取整份資料。
  2. Ctrl + T
  3. 確認「我的表格具有標題列」有打勾。
  4. 按下確定。

完成後,建議把這個 Excel 表格命名為 tbl_保健配方。這個名稱之後會在 Power Query 的 M 程式碼中用到。

四、Power Query 操作步驟

步驟 1:將資料載入 Power Query

點選表格中的任一儲存格,接著到 Excel 上方功能區選擇:

資料 → 從表格/範圍

Power Query 編輯器就會開啟。

步驟 2:確認欄位格式

請確認以下兩個欄位都是文字格式:

  • 配方代號
  • 保健食品原料

如果不是文字,可以手動改成「文字」。

步驟 3:先修剪文字

這一步很重要。若同樣的原料名稱前後多了一個空格,Power Query 會視為不同內容,去重複時就會失效。

先選取「配方代號」欄,再到:

轉換 → 格式 → 修剪

接著選取「保健食品原料」欄,同樣執行:

轉換 → 格式 → 修剪

步驟 4:排除空白列

如果來源資料可能有空白列,建議在這一步先濾掉。你可以點欄位右側的篩選箭頭,把空白與 null 取消勾選。

步驟 5:使用「分組依據」

這一步是核心步驟。請到:

常用 → 分組依據

請注意,繁體中文介面是叫做 分組依據

進入視窗後,先點選上方的「進階」模式,再依以下設定填入:

  • 分組欄位:配方代號
  • 新欄名稱:配方內容
  • 作業:選擇「所有資料列」旁的自訂選項,直接在公式欄輸入以下內容:
each Text.Combine(List.Distinct(List.RemoveNulls([保健食品原料])), ", ")

這段公式的作用是:

  1. 從每一組的「保健食品原料」清單中移除空值。
  2. 將重複原料去除。
  3. 最後用逗號加空格串成一個字串。

按下確定後,你會看到每個配方代號只剩一列,而「配方內容」欄位裡已經是串接好的結果,不會出現中間的小表格欄位。

⚠️ 若找不到「所有資料列」選項,請確認使用的是 Excel 2016 以後的版本,或 Microsoft 365 最新版。

步驟 6:將結果載回 Excel

最後點選:

常用 → 關閉並載入

如果你想把結果放到另一張指定工作表,例如「配方整理結果」,也可以用:

關閉並載入至…

再指定載入位置即可。

五、直接貼上的 M 程式碼

如果你不想一步一步操作,也可以直接把下面這段 M 程式碼貼進 Power Query 的「進階編輯器」。前提是你的 Excel 表格名稱叫做 tbl_保健配方

請到:

常用 → 進階編輯器

然後把內容改成下面這段:

let
    Source = Excel.CurrentWorkbook(){[Name="tbl_保健配方"]}[Content],
    #"變更型別" = Table.TransformColumnTypes(Source, {
        {"配方代號", type text},
        {"保健食品原料", type text}
    }),
    #"修剪文字" = Table.TransformColumns(#"變更型別", {
        {"配方代號", Text.Trim, type text},
        {"保健食品原料", Text.Trim, type text}
    }),
    #"篩除空白列" = Table.SelectRows(#"修剪文字", each
        [配方代號] <> null and [配方代號] <> "" and
        [保健食品原料] <> null and [保健食品原料] <> ""
    ),
    #"分組依據" = Table.Group(#"篩除空白列", {"配方代號"}, {
        {"配方內容", each Text.Combine(List.Distinct([保健食品原料]), ", "), type text}
    }),
    #"排序結果" = Table.Sort(#"分組依據", {{"配方代號", Order.Ascending}})
in
    #"排序結果"

這段 M 程式碼對應的操作邏輯,與前述 UI 步驟一致:變更型別 → 修剪文字 → 篩除空白列 → 分組依據(含去重複與串接)→ 排序。貼上後可直接按「完成」,不需要額外刪除中間欄位。

六、常見錯誤與注意事項

1. Power Query 讀的是表格名稱,不是工作表名稱

很多人會以為工作表叫做「保健配方來源」,Power Query 就會直接用這個名稱讀取資料。實際上,Power Query 在這個情境裡抓的是 Excel 表格名稱,所以你要確認表格名稱是不是 tbl_保健配方

2. 去重複是依完全相同的文字判斷

例如「維生素C」與「維生素C 」看起來很像,但後面多了一個空格,Power Query 會視為不同值。因此正式資料最好先做「修剪」。

3. 串接順序通常跟原始資料順序有關

本文這種寫法,配方內容通常會依原始資料出現順序來串接。如果你先把來源資料排序過,最後配方內容的排列順序也可能會改變。

4. 若想連大小寫也一起標準化,可以再多做一步

如果你的資料來源有時是 Vitamin C、有時是 vitamin c,也可以在 Power Query 中先做大小寫統一,再做分組依據與去重複。

七、結語

這類「同一代號對應多筆原料,最後要資料歸戶整理成一列」的需求,用 Power Query 很實用。因為你只要設定好一次流程,未來更新來源資料後,只要按重新整理,就能重新產出新的配方整理結果。對於保健食品、藥品成分、原料清單或其他需要歸戶彙整的資料來說,這種做法通常會比手動複製貼上更穩定。

讀者留言

捲動到此處時自動載入留言…