如何在Excel单元格中提取去重的7位SKU并关联商品名称?
提取Excel中7位SKU并关联商品名称的解决方案
一、用Power Query批量处理多文件(推荐,适合大量数据)
Power Query能一次性处理多个Excel文件,自动完成提取、去重SKU并关联商品名称的操作,步骤如下:
- 导入所有目标文件:
- 打开Excel,点击「数据」选项卡 → 获取数据 → 从文件 → 从文件夹
- 选择存放Excel文件的文件夹,点击「组合 & 加载」,将所有文件的数据合并到一个查询中
- 提取7位SKU(处理*K后缀):
- 在查询编辑器中,选中包含SKU的列,点击「添加列」→自定义列,输入公式:
该公式会先清除内容中的List.Distinct(List.Transform(Text.Split(Text.Remove([目标列列名], {"*", "K"}), " "), each if Text.Length(_)=7 and Value.Is(Value.FromText(_), type number) then _ else null))*和K,按空格拆分文本,筛选出7位纯数字内容后去重 - 将生成的列表列展开为多行,让每个SKU单独占一行
- 在查询编辑器中,选中包含SKU的列,点击「添加列」→自定义列,输入公式:
- 关联商品名称:
- 保留原始商品名称列,展开SKU后,每个SKU会自动对应原行的商品名称
- 去重并导出:
- 选中SKU列,点击「开始」→删除重复项,最后点击「关闭并上载」,将结果导出到Excel表
二、VBA脚本(适合自定义需求)
如果需要更灵活的处理逻辑,可编写VBA宏遍历单元格提取SKU:
Sub Extract7DigitSKU() Dim ws As Worksheet, newWs As Worksheet Dim cell As Range, skuArr As Variant, sku As String Dim skuDict As Object Set skuDict = CreateObject("Scripting.Dictionary") ' 创建新工作表存储结果 Set newWs = ThisWorkbook.Sheets.Add newWs.Range("A1") = "商品名称": newWs.Range("B1") = "SKU" ' 遍历当前工作表(可修改为遍历多工作表) Set ws = ActiveSheet For Each cell In ws.UsedRange.Columns(1).Cells ' 假设商品名称在A列,SKU在右侧一列,自行调整列偏移 If cell.Value <> "" Then ' 清除*和K,拆分单元格内容 skuArr = Split(Replace(Replace(cell.Offset(0, 1).Value, "*", ""), "K", ""), " ") For Each sku In skuArr ' 筛选7位纯数字SKU If Len(sku) = 7 And IsNumeric(sku) Then ' 去重并记录对应商品名称 If Not skuDict.Exists(sku) Then skuDict(sku) = cell.Value newWs.Cells(newWs.Rows.Count, 1).End(xlUp).Offset(1, 0) = cell.Value newWs.Cells(newWs.Rows.Count, 2).End(xlUp).Offset(1, 0) = sku End If End If Next sku End If Next cell End Sub
使用说明:
- 按
Alt+F11打开VBA编辑器,插入模块后粘贴代码 - 根据你的表格结构,调整代码中列的偏移位置(比如
cell.Offset(0,1)表示SKU在名称列右侧一列) - 运行宏,结果会自动生成在新工作表中
三、进阶函数组合(无需工具,适合单表小数据)
用TEXTJOIN+FILTERXML提取单元格内的所有7位SKU,再配合UNIQUE去重:
- 提取单个单元格的7位SKU:
在空白单元格输入公式(假设目标内容在A1):
该公式会先清除=TEXTJOIN(",",TRUE,FILTERXML("<t><s>"&SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A1,"*",""),"K","")," ","</s><s>")&"</s></t>","//s[string-length(.)=7 and number(.)=.]"))*和K,按空格拆分文本,筛选出7位纯数字内容后用逗号合并 - 批量提取并去重:
将公式下拉到所有行,再用UNIQUE提取所有不重复的SKU:=UNIQUE(TOCOL(TEXTJOIN(",",TRUE,FILTERXML("<t><s>"&SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(A:A,"*",""),"K","")," ","</s><s>")&"</s></t>","//s[string-length(.)=7 and number(.)=.]")),TRUE)) - 关联商品名称:
用XLOOKUP或INDEX+MATCH函数,将去重后的SKU对应回原商品名称
内容的提问来源于stack exchange,提问作者MMM
相关产品推荐
相关产品推荐

