Как вы можете динамически извлечь строку из более длинной строки в Excel? - PullRequest
0 голосов
/ 30 августа 2018

Возьмите этот пример:

Столбец А

  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 USD 11100A

Все 3 строки разные. Разная длина, разное количество подстрок и т. Д.

Как извлечь из этой строки только код валюты?

Я хочу, чтобы столбец B имел:

  1. EUR
  2. GBP
  3. USD

Можно ли это сделать, не используя слишком много различных функций в одной формуле? Я думал использовать SEARCH для поиска одной строки в списке ... то есть "GBP", "USD", "EUR" и т. Д., Но это не работает. Он работает только для первой строки, поэтому SEARCH нельзя использовать для проверки нескольких возможных значений.

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

Вы также можете использовать регулярное выражение в пользовательской функции, что означает, что вы можете выполнить в цикле над столбцом 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

Regex:

Попробуйте регулярное выражение здесь .

В основном для сопоставления используются валюты в стиле ИЛИ. Сопоставьте эту валюту или эту валюту и т. Д. Они сопоставляются тем, что являются отдельными словами, а не частью более длинной строки.

/ \ BEUR | GBP | USD \ б / г

1-ая альтернатива \ bEUR

\ b утверждение позиции на границе слова (^ \ w | \ w $ | \ W \ w | \ w \ W)

EUR соответствует буквам EUR буквально (с учетом регистра)

2-й вариант GBP

GBP соответствует буквам символов GBP (с учетом регистра)

3-й вариант USD \ b

USD соответствует буквам символов USD (с учетом регистра)

\ b утверждение позиции на границе слова (^ \ w | \ w $ | \ W \ w | \ w \ W)


В листе:

Sheet

Вы можете хранить массив валют в одной ячейке и ссылаться на эту ячейку как на второй аргумент функции.

0 голосов
/ 30 августа 2018

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))
0 голосов
/ 30 августа 2018

Попробуйте это:

=TRIM(RIGHT(SUBSTITUTE(LEFT(A1,LEN(A1)-LEN(TRIM(RIGHT(SUBSTITUTE(A1, " ", REPT(" ", 100)), 100)))-1), " ", REPT(" ", 100)), 100))

A1 - ячейка со значением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...