我有一个简单的问题,我希望用一个非常简单的 Excel 函数来解决。
我有一个包含多行(全部在一列中)的列表,其中包含属性及其对应的值,每行都用 | 分隔。它基本上看起来像这样:
Color:Red|Size:M|COD:United States|Price:50.84
Color:Blue|Category:Jeans|COD:China|Price:29.95
现在,我想在单独的列中提取每个属性之后的字符串,并且仅在值存在时才填充该列。最后它应该是这样的:
我找到了使用以下代码的解决方案,但它只适用于第一列:
=TEIL(LEFT($A2;MID("|";$A2)-1);FIND(B$1;$A2)+1+LEN(B$1);LEN($A2))
如果您知道解决该问题的 VBA 解决方案,也将不胜感激!
最佳答案
每个属性一个 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,并在公式 (LONGFORM
& ATTRIBUTE
) 中提供两个输入,其中属性是颜色、尺寸、类别、COD、价格。理想情况下,您只需将第二个参数设置为感兴趣的标题并向下拖动。值得注意的是,在当前形式中,属性参数是区分大小写的,不能容忍拼写错误。
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
方法类似,只是您将为每一列调用不同的函数但只提供一个输入
关于Excel:如何提取文本字符串中的文本直到分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65359613/