我想从下面的字符串中提取价格/费率。
“38A 标准 - HotelCollect 2019-01-01 每日价格 99.00 加元 2019-01-02 每日价格 99.00 加元”
我想提取紧接着“计算机辅助设计“到不同的单元格或者如果可能的话也添加它们。
我真的被这个问题难住了,有人能帮忙吗?
答案1
1:确定你需要获得多少利率
=(LEN(A1)-LEN(SUBSTITUTE(A1,"CAD","")))/3
将此公式复制到B1
。它会将您的字符串长度与删除所有“CAD”实例后的字符串长度进行比较,然后将结果除以 3 以找出“CAD”出现的次数。
2:为下一个函数设定种子
1
将 a 写入1
。C1
这并非绝对必要,但我们这样做是为了让我们写入的公式D1
可以不经修改地复制过来。
3:FIND
每个实例
=IF($B1>COLUMN()-4,FIND("CAD",$A1,C1+1),"")
此公式会复制数据中所需字符串的尽可能多的实例。请注意将此单元格的位置与步骤 1 中的计数器位置进行比较的硬编码列值偏移量。如果您以不同的方式排列数据,则必须调整此公式(一次)。
将此公式写入D1
;对于此示例,我从中复制了过来D1:G1
。
4:做MID
=IFERROR(IF(D1>0,TRIM(MID($A1,D1+4,6)),""),"")
此公式可复制到尽可能多的实例...等等。它确实要求您手动复制尽可能多的次数,就像您在步骤 3 中所做的那样。
将此公式写入H1
;对于此示例,我从中复制了过来H1:K1
。
笔记
- 设置这么多辅助列和这么多手动工作量,这确实有点草率,但您的问题并未提及您的用例或工作流程,因此我并没有花大量时间考虑如何简化。如果您的所有数据都在列中
A
,则完全按照此处介绍的方式复制此设置将为您提供列中所需的数据H:K
,并向下复制尽可能多的数据A
。 - 如果您的实际用例正在寻找
SUM
或其他什么,那么那部分当然是微不足道的,并且在此示例中将进入列L
;如果您愿意,可以隐藏所有内容B:K
,或者当然可以将它们全部组合在一个“上帝公式”中,尽管这样做所需的努力可能不会根据您的工作流程限制而表明。 - 在第 4 步中有一些弄虚作假;我编写它是为了获取“CAD”后面空格后面的 6 个字符(然后修剪所有空格);这假设您想要的输出大小永远不会超过 6 个字符。同样,您没有在规范中包含太多示例数据或任何描述,所以我在这里猜测一下可能的数据参数会是什么样子;当您想要的字符串完全遵循 dd.cc 或 ddd.cc 格式时,这种方法有效 - 省略数字会导致问题,超过 999.99 加元的费率也会导致问题(记录显示,当人们问问题要具体并包括示例数据输入和输出时,他们指的是这样的困难)。
答案2
尝试以下用户定义函数:
Public Function PriceFinder(s As String) As Double
Dim i As Long
arr = Split(s, " ")
For i = LBound(arr) To UBound(arr)
If arr(i) = "CAD" Then
PriceFinder = CDbl(arr(i + 1))
Exit Function
End If
Next i
End Function
编辑#1:
要得到超过一个价格,请使用此版本的 UDF:
Public Function PriceFinder(s As String) As String
Dim i As Long
arr = Split(s, " ")
For i = LBound(arr) To UBound(arr)
If arr(i) = "CAD" Then
If PriceFinder = "" Then
PriceFinder = arr(i + 1)
Else
PriceFinder = PriceFinder & "," & arr(i + 1)
End If
End If
Next i
If Right(PriceFinder, 1) = """" Then PriceFinder = Left(PriceFinder, Len(PriceFinder) - 1)
End Function