以这个例子为例:
A列
所有3行都不同。不同的长度,不同的子串数等。
如何从该字符串中仅提取货币代码?
我希望B列具有:
可以在一个公式中不使用太多不同函数的情况下完成此操作吗?我当时正在考虑使用SEARCH在列表中查找一个字符串。即“ GBP”,“ USD”,“ EUR”等-但这不起作用。它只对第一个字符串有效,因此SEARCH不能用于检查多个可能的值。
答案 0 :(得分:1)
尝试一下:
=TRIM(RIGHT(SUBSTITUTE(LEFT(A1,LEN(A1)-LEN(TRIM(RIGHT(SUBSTITUTE(A1, " ", REPT(" ", 100)), 100)))-1), " ", REPT(" ", 100)), 100))
A1是具有值的单元格
答案 1 :(得分:1)
您还可以在用户定义的函数中使用正则表达式,这意味着您可以在A列循环执行,写出B列,或在B列的工作表中使用。您可以传递以下货币的列表兴趣作为函数的第二个参数。如果您的列表中存在一种以上的货币,则会返回以逗号分隔的列表。
Option Explicit
Public Sub Testing()
Dim tests(), i As Long, currencies()
currencies = Array("EUR", "GBP", "USD")
tests = Array("392898 818 AA 8812 1918281 000 EUR 100A", _
"31898 818 AA 88172 1281 000 GBP 1A", _
"12100098 618 AA 612 7281 000 USD 11100A")
For i = LBound(tests) To UBound(tests)
Debug.Print GetCurrency(tests(i), currencies)
Next
End Sub
Public Function GetCurrency(ByVal inputString As String, ByVal currencies As Variant) As String
Dim matches As Object, total As Long, arr(), i As Long
With CreateObject("VBScript.RegExp")
.Global = True
.MultiLine = True
.Pattern = "\b" & Join(currencies, Chr$(124)) & "\b"
If .TEST(inputString) Then
Set matches = .Execute(inputString): total = matches.Count - 1
ReDim arr(0 To total)
For i = 0 To total
arr(i) = matches(i)
Next
GetCurrency = Join(arr, Chr$(44))
Else
GetCurrency = vbNullString
End If
End With
End Function
正则表达式:
尝试使用正则表达式here。
它基本上以OR方式使用货币进行匹配。匹配此货币或该货币等。它们是作为单个单词而不是较长字符串的一部分进行匹配的。
/ \ bEUR | GBP | USD \ b / gm
第一替代\ bEUR
\ b在单词边界(^ \ w | \ w $ | \ W \ w | \ w \ W)的断言位置
EUR从字面上匹配字符EUR(区分大小写)
第二种替代英镑
GBP从字面上匹配字符GBP(区分大小写)
第三种替代货币\ b
USD从字面上匹配字符USD(区分大小写)
\ b在单词边界(^ \ w | \ w $ | \ W \ w | \ w \ W)的断言位置
工作表中:
您可以将货币数组存储在单个单元格中,并将该单元格称为第二个函数参数。
答案 2 :(得分:0)
SEARCH
和/或FIND
(注意FIND
区分大小写,而SEARCH
不区分大小写)当然可以用于返回多个搜索结果。它返回一个数组,因此您必须考虑到这一点。
例如,如果您具有某个范围内的可能货币的列表(我将其命名为currList
),则以下公式将返回匹配货币的名称:
=INDEX(currList,LOOKUP(2,1/(ISNUMBER(FIND(currList,A1))),ROW(INDIRECT("1:"&ROWS(currList)))))
如示例所示,如果货币代码始终是字符串的倒数第二个,那么您只需返回该值即可。
这是一种方法:
=TRIM(MID(SUBSTITUTE(TRIM(A1)," ",REPT(" ",99)),(LEN(TRIM(A1))-LEN(SUBSTITUTE(TRIM(A1)," ",""))-1)*99,99))