【问题标题】:Excel: How to extract text within a string of text until separatorExcel:如何提取文本字符串中的文本直到分隔符
【发布时间】:2021-03-29 06:13:54
【问题描述】:

我有一个简单的问题,我希望用一个非常简单的 Excel 函数来解决。

我有一个包含多行(都在一列中)的列表,其中包含属性及其对应的值,每行都用 | 分隔。基本上是这样的:

Color:Red|Size:M|COD:United States|Price:50.84
Color:Blue|Category:Jeans|COD:China|Price:29.95

现在,我想在单独的列中提取每个属性之后的字符串,并且仅在存在值时才填充该列。最后应该是这样的:

LONGFORM Color Size Category COD Price
Color:... Red M United States 50.84
Color:... Second Jeans China 29.95

我找到了使用以下代码的解决方案,但它仅适用于第一列:

=TEIL(LEFT($A2;MID("|";$A2)-1);FIND(B$1;$A2)+1+LEN(B$1);LEN($A2))

如果您知道解决它的 VBA 解决方案,也很感激!

【问题讨论】:

标签: excel vba excel-formula extract


【解决方案1】:

每个属性一个 UDF

为您的 5 个类别中的每一个创建一个 UDF,然后像往常一样使用公式,其中输入只是您的 LONGFORM 值。这是Color 的示例。您将为每个属性创建一个副本,并将Color 替换为适当的名称。

注意:对于价格,您需要将函数输出声明为 Double 而不是 String

Public Function Get_Color(Target As Range) As String

Dim i As Long, Temp
Temp = Split(Target, "|")

For i = LBound(Temp) To UBound(Temp)
    If InStr(Temp(i), "Color") Then
        Get_Color = Split(Temp(i), ":")(1)
        Exit Function
    End If
Next i

End Function

一个带有属性参数的UDF

您还可以全面使用一个 UDF,并在公式中提供两个输入(LONGFORMATTRIBUTE),其中属性是颜色、尺寸、类别、货到付款、价格。理想情况下,您只需将第二个参数设置为感兴趣的标题并向下拖动。值得注意的是,在当前形式中,属性参数不区分大小写。

Public Function Get_Attribute(Target As Range, Element As String)

Get_Attribute = ""
Dim i As Long, Temp
Temp = Split(Target, "|")

For i = LBound(Temp) To UBound(Temp)
    If InStr(Temp(i), Element) Then
        Get_Attribute = Split(Temp(i), ":")(1)
        If IsNumeric(Get_Attribute) Then Get_Attribute = CDbl(Get_Attribute)
        Exit Function
    End If
Next i

End Function

这是第二种解决方案的示例以及如何调用该函数。 One Attribute : One UDF 方法与此类似,只是您将为每一列调用不同的函数,但只提供一个输入

【讨论】:

  • 此处未解决的问题...价格列输出为文本,因此您无法跨字段求和、添加等。
  • @ScottCraner 当我修复数字问题时,它将空白转换为 0(C3 和 D2)lol
  • 一如既往地感谢@ScottCraner
【解决方案2】:

调整我的答案HERE

将您的标签放在顶部,在 B2 中使用 FILTERXML 并上下复制:

=IFERROR(FILTERXML("<a><b>"&SUBSTITUTE(SUBSTITUTE($A2,":","|"),"|","</b><b>")&"</b></a>","//b[preceding::*[1]='"&B$1&"']"),"")

【讨论】:

  • 谢谢!不幸的是,它似乎不适用于我的 Excel,因为它是德语的,我找不到函数“前面”部分的翻译。知道我在哪里可以找到这方面的文档吗?
  • 你试过不翻译preceding吗?不确定是否需要。
  • preceding:: 是纯 XPath 语法(由万维网联盟 W3C 定义),不打算翻译成区域语言。请参阅XPath syntaxXPath axes 的示例:-)
【解决方案3】:

仅当您具有 LET() 函数(在更新版本的 Excel 中可用)时,此答案才会按以下方式工作。否则你可以使用相同的逻辑,但函数会更长,更难阅读。

B3 单元格中的公式为:

=LET(v,LET(x,FIND(B$3:F$3,$A4),IF(ISERROR(x),"",LET(s,MID($A4,x,IFERROR(FIND($C$1,$A4,x)-1,LEN($A4))+1-x),RIGHT(s,LEN(s)-LEN(B$3:F$3)-1)))),IFERROR(VALUE(v),v))

然后将这个公式复制到行中。

这是一个数组公式,因此将字段标题行(“颜色”、“大小”等)作为输入,然后用公式结果填充单元格。我通过将分隔符(此处为 |)作为变量对其进行了概括。数值应保留为数字。

【讨论】:

    猜你喜欢
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    相关资源
    最近更新 更多