【问题标题】:Excel Group and Match by Product NameExcel 按产品名称分组和匹配
【发布时间】:2020-04-15 01:03:46
【问题描述】:

我有一个产品数据的 Excel 电子表格,我需要对其进行重组并按产品名称进行分组。产品名称示例如下所示:

Bee 22"x36" Table Runner, Ecru

是否有一个公式可以找到并分组所有其他同名产品?

例如,我需要公式也包含

Bee 22"x48" Table Runner, White

在分组结果中。它是同一种产品,只是颜色和尺寸不同。我想我需要使用 excel 通配符,但这就是我所拥有的。

其他产品示例:

Carillon 大号象牙吊坠
Carillon 吊坠中号象牙色
Carillon 吊坠小象牙色
羊绒毛皮枕霜
羊绒毛皮枕 浅灰色
焦点特大床
焦点床头柜
焦点大床
焦点餐具柜
Godenza 餐桌矩形黑灰
Godenza 餐桌矩形胡桃木
Godenza 餐桌圆形黑灰
高盛雕像大
小高盛雕像

【问题讨论】:

  • 强烈建议您将产品/颜色/尺寸分成不同的列,然后使用数据透视表。
  • 同意 Ben 的观点,您可以根据您的数据对“文本到列”进行几次迭代来完成此操作
  • @BigBen 由于产品名称的长度不同,数据不会按产品/颜色/尺寸完全分成不同的列。这是另一个用于比较的产品名称Bristol Garden 14x20 Placemat (Set of 4), Cafe 对此有何建议?
  • @MichelleM。从小处着手。文本到列并使用“,”分隔它,然后可能是“符号或“x”等。
  • 考虑使用最左边的 12 个字符作为排序键或填充辅助列。

标签: excel vba excel-formula worksheet-function


【解决方案1】:

我假设给定字符串的结构类似于:<manufacturer> <dimensions> <product>, <colour>

也就是说,在字符串Bee 22"x36" Table Runner, Ecru

  • <manufacturer> = Bee
  • <dimensions> = 22"x36"
  • <product> = Table Runner
  • <colour> = Ecru

我还假设当您说要“按产品名称分组”时,您希望按 <product> 分组(即 <dimensions><colour> 之间的文本)。

最后,我假设最好先提取<product>。此后,您可以根据需要对行进行排序/重新组织,因为您没有详细描述您想要实现的最终结果。


使用 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(它允许您使用正则表达式进行更复杂/灵活的字符串匹配)来代替上述方法。

  1. 打开 VB 编辑器 (Alt + F11)
  2. Insert > Module
  3. 将下面的代码粘贴到新插入的模块中。

代码:

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
  1. 那么您应该可以直接从工作表中调用ExtractProduct(即假设单元格A2 包含一些输入,请在单元格B2 中输入=ExtractProduct(A2)

很遗憾,Excel 中的内置工作表函数目前似乎不支持正则表达式(与 Google 表格之类的功能相比)。所以这不能仅仅通过一个简单的公式来实现——或者至少这是我的理解。

【讨论】:

  • 我在调用 ExtractProduct 时收到错误“产品名称不明确”。有什么想法吗?
  • @MichelleM。检查您的 VBA 代码(所有工作表模块、ThisWorkbook 模块、自定义模块)以查看是否只有一个名为 ExtractProduct 的变量/函数。错误可能是“检测到不明确的名称”(不是“不明确的产品名称”),其中“名称”指的是函数的名称(ExtractProduct)——与函数恰好提取的事实无关产品名称。如果您发现多个ExtractProduct,请删除/重命名/限定其他的(取决于您是否要保留它们)。在没有看到您的 Excel 文件/代码的情况下,我只能这么说。
  • 好吧,我删除了有冲突的 VBA 模块。现在,当我运行 ExtractProduct 时,所有产品的结果都显示为 #N/A,尽管其中一些产品匹配。
  • @MichelleM。您能否举例说明返回 #N/A 但应该包含匹配项的产品?如果您可以将尽可能多的内容编辑到您的问题中,那么我将检查是否可以调整 PRODUCT_PATTERN(在代码中)。
  • 我添加了其他产品示例。感谢您的帮助:)
猜你喜欢
  • 2010-10-10
  • 2014-10-21
  • 1970-01-01
  • 2022-07-19
  • 1970-01-01
  • 2013-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多