如何在Excel中从较长的字符串中动态提取字符串?

时间:2018-08-30 15:29:06

标签: excel excel-formula

以这个例子为例:

A列

  1. 392898 818 AA 8812 1918281 000 EUR 100A
  2. 31898 818 AA 88172 1281 000 GBP 1A
  3. 12100098 618 AA 612 7281 000美元11100A

所有3行都不同。不同的长度,不同的子串数等。

如何从该字符串中仅提取货币代码?

我希望B列具有:

  1. EUR
  2. GBP
  3. 美元

可以在一个公式中不使用太多不同函数的情况下完成此操作吗?我当时正在考虑使用SEARCH在列表中查找一个字符串。即“ GBP”,“ USD”,“ EUR”等-但这不起作用。它只对第一个字符串有效,因此SEARCH不能用于检查多个可能的值。

3 个答案:

答案 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)的断言位置


工作表中

Sheet

您可以将货币数组存储在单个单元格中,并将该单元格称为第二个函数参数。

答案 2 :(得分:0)

SEARCH和/或FIND(注意FIND区分大小写,而SEARCH不区分大小写)当然可以用于返回多个搜索结果。它返回一个数组,因此您必须考虑到这一点。

例如,如果您具有某个范围内的可能货币的列表(我将其命名为currList),则以下公式将返回匹配货币的名称:

=INDEX(currList,LOOKUP(2,1/(ISNUMBER(FIND(currList,A1))),ROW(INDIRECT("1:"&ROWS(currList)))))

enter image description here

如示例所示,如果货币代码始终是字符串的倒数第二个,那么您只需返回该值即可。

这是一种方法:

=TRIM(MID(SUBSTITUTE(TRIM(A1)," ",REPT(" ",99)),(LEN(TRIM(A1))-LEN(SUBSTITUTE(TRIM(A1)," ",""))-1)*99,99))