Excel 按产品名称分组和匹配
Excel Group and Match by Product Name
我有一个 excel 产品数据电子表格,需要按产品名称重新组织和分组。产品名称示例如下:
Bee 22"x36" Table Runner, Ecru
是否有一个公式可以找到所有其他具有相同名称的产品并将其分组?
例如,我需要公式还包括
Bee 22"x48" Table Runner, White
在分组结果中。它是同一种产品,只是颜色和尺寸不同。我在想我将需要使用 excel 通配符,但这就是我所拥有的。
其他产品示例:
大象牙色钟琴吊坠
Carillon 吊坠中号象牙色
钟琴吊坠小象牙色
羊绒毛皮枕霜
羊绒毛皮抱枕浅灰
福克斯大床
Focus 床头柜
焦点大床
焦点餐具柜
Godenza Dining Table 长方形黑灰
Godenza Dining Table 长方形胡桃木
Godenza Dining Table 圆形黑灰
高盛雕像大号
小金人雕像
我假设给定字符串的结构类似于:<manufacturer> <dimensions> <product>, <colour>
.
换句话说,在字符串 Bee 22"x36" Table Runner, Ecru
:
<manufacturer>
= Bee
<dimensions>
= 22"x36"
<product>
= Table Runner
<colour>
= Ecru
我还假设当你说你想要 "group by product name" 时,你想按 <product>
分组(即 <dimensions>
和 <colour>
之间的文本) .
最后,我假设先提取 <product>
可能更好。此后,您可以根据需要 sort/re-organise 行,因为您没有详细描述要达到的最终结果。
使用 Excel 函数和辅助列
虽然 MATCH
对 *
和 ?
等通配符提供有限的支持,但我没有使用它。如果单元格 A2
中有给定的字符串,请尝试以下操作:
- 在单元格
B2
中,粘贴:=INDEX(SEARCH({"0 ","1 ","2 ","3 ","4 ","5 ","6 ","7 ","8 ","9 "},SUBSTITUTE(A2,"""","")),MATCH(TRUE,ISNUMBER(SEARCH({"0 ","1 ","2 ","3 ","4 ","5 ","6 ","7 ","8 ","9 "},SUBSTITUTE(A2,"""",""))),0))
- 在单元格
C2
中,粘贴:=SEARCH(" ",MID(A2,1,9999),B2)+1
- 在单元格
D2
中,粘贴:=SEARCH(",",A2)
- 在单元格
E2
中,粘贴:=MID(A2,C2,D2-C2)
这应该会在单元格 E2
.
中为您提供提取的 <product>
使用VBA和正则表达式
您可以尝试使用 VBA(它允许您使用正则表达式进行更多 sophisticated/flexible 字符串匹配)来代替上述方法。
- 打开 VB 编辑器 (
Alt
+ F11
)
Insert
> Module
- 将下面的代码粘贴到新插入的模块中。
代码:
Option Explicit
Public Function ExtractProduct(ByVal someText As String) As Variant
Const PRODUCT_PATTERN As String = "\d+["" ]?x ?\d+""? (.+?),"
Dim regExp As Object
Set regExp = CreateObject("VBScript.RegExp")
regExp.Pattern = PRODUCT_PATTERN
Dim matchesFound As Object
Set matchesFound = regExp.Execute(someText)
If matchesFound.Count > 0 Then
If matchesFound(0).SubMatches.Count > 0 Then
ExtractProduct = matchesFound(0).SubMatches(0)
Else
ExtractProduct = CVErr(xlErrNA)
End If
Else
ExtractProduct = CVErr(xlErrNA)
End If
End Function
- 那么您应该能够直接从工作表调用
ExtractProduct
(即假设单元格 A2
包含一些输入,在单元格 B2
中输入 =ExtractProduct(A2)
)
不幸的是,Excel 中的内置工作表函数目前似乎不支持正则表达式(与 Google 工作表之类的东西相比)。所以这不能仅用一个简单的公式来实现——或者至少这是我的理解。
我有一个 excel 产品数据电子表格,需要按产品名称重新组织和分组。产品名称示例如下:
Bee 22"x36" Table Runner, Ecru
是否有一个公式可以找到所有其他具有相同名称的产品并将其分组?
例如,我需要公式还包括
Bee 22"x48" Table Runner, White
在分组结果中。它是同一种产品,只是颜色和尺寸不同。我在想我将需要使用 excel 通配符,但这就是我所拥有的。
其他产品示例:
大象牙色钟琴吊坠
Carillon 吊坠中号象牙色
钟琴吊坠小象牙色
羊绒毛皮枕霜
羊绒毛皮抱枕浅灰
福克斯大床
Focus 床头柜
焦点大床
焦点餐具柜
Godenza Dining Table 长方形黑灰
Godenza Dining Table 长方形胡桃木
Godenza Dining Table 圆形黑灰
高盛雕像大号
小金人雕像
我假设给定字符串的结构类似于:<manufacturer> <dimensions> <product>, <colour>
.
换句话说,在字符串 Bee 22"x36" Table Runner, Ecru
:
<manufacturer>
=Bee
<dimensions>
=22"x36"
<product>
=Table Runner
<colour>
=Ecru
我还假设当你说你想要 "group by product name" 时,你想按 <product>
分组(即 <dimensions>
和 <colour>
之间的文本) .
最后,我假设先提取 <product>
可能更好。此后,您可以根据需要 sort/re-organise 行,因为您没有详细描述要达到的最终结果。
使用 Excel 函数和辅助列
虽然 MATCH
对 *
和 ?
等通配符提供有限的支持,但我没有使用它。如果单元格 A2
中有给定的字符串,请尝试以下操作:
- 在单元格
B2
中,粘贴:=INDEX(SEARCH({"0 ","1 ","2 ","3 ","4 ","5 ","6 ","7 ","8 ","9 "},SUBSTITUTE(A2,"""","")),MATCH(TRUE,ISNUMBER(SEARCH({"0 ","1 ","2 ","3 ","4 ","5 ","6 ","7 ","8 ","9 "},SUBSTITUTE(A2,"""",""))),0))
- 在单元格
C2
中,粘贴:=SEARCH(" ",MID(A2,1,9999),B2)+1
- 在单元格
D2
中,粘贴:=SEARCH(",",A2)
- 在单元格
E2
中,粘贴:=MID(A2,C2,D2-C2)
这应该会在单元格 E2
.
<product>
使用VBA和正则表达式
您可以尝试使用 VBA(它允许您使用正则表达式进行更多 sophisticated/flexible 字符串匹配)来代替上述方法。
- 打开 VB 编辑器 (
Alt
+F11
) Insert
>Module
- 将下面的代码粘贴到新插入的模块中。
代码:
Option Explicit
Public Function ExtractProduct(ByVal someText As String) As Variant
Const PRODUCT_PATTERN As String = "\d+["" ]?x ?\d+""? (.+?),"
Dim regExp As Object
Set regExp = CreateObject("VBScript.RegExp")
regExp.Pattern = PRODUCT_PATTERN
Dim matchesFound As Object
Set matchesFound = regExp.Execute(someText)
If matchesFound.Count > 0 Then
If matchesFound(0).SubMatches.Count > 0 Then
ExtractProduct = matchesFound(0).SubMatches(0)
Else
ExtractProduct = CVErr(xlErrNA)
End If
Else
ExtractProduct = CVErr(xlErrNA)
End If
End Function
- 那么您应该能够直接从工作表调用
ExtractProduct
(即假设单元格A2
包含一些输入,在单元格B2
中输入=ExtractProduct(A2)
)
不幸的是,Excel 中的内置工作表函数目前似乎不支持正则表达式(与 Google 工作表之类的东西相比)。所以这不能仅用一个简单的公式来实现——或者至少这是我的理解。