如果你的 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 表格。做法如下:
- 選取整份資料。
- 按 Ctrl + T。
- 確認「我的表格具有標題列」有打勾。
- 按下確定。
完成後,建議把這個 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([保健食品原料])), ", ")
這段公式的作用是:
- 從每一組的「保健食品原料」清單中移除空值。
- 將重複原料去除。
- 最後用逗號加空格串成一個字串。
按下確定後,你會看到每個配方代號只剩一列,而「配方內容」欄位裡已經是串接好的結果,不會出現中間的小表格欄位。
⚠️ 若找不到「所有資料列」選項,請確認使用的是 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 很實用。因為你只要設定好一次流程,未來更新來源資料後,只要按重新整理,就能重新產出新的配方整理結果。對於保健食品、藥品成分、原料清單或其他需要歸戶彙整的資料來說,這種做法通常會比手動複製貼上更穩定。
捲動到此處時自動載入留言…