Извлечь строку по позиции - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть строка со странами, разделенными ;. Это пример, расположенный в ячейке: RO;BE;AU;CN;DE;UK;ES;HU;NL;SE;AT;EL;CZ.

С другой стороны, у меня есть еще одна ячейка с организациями, также отделенная ;: например, Org1; Org2; Org3..., и она имеет ту же позицию, что и страны.

Теперь я должен найти позицию страны (например, DE) и извлечь организацию в той же позиции в другой ячейке.

То, что я определил, это позиция поиспользуя формулу FIND. Теперь мне нужно извлечь организацию, разделенную запятыми, но я не знаю, как это сделать. Я пробовал функции LEFT, RIGHT ... Также INDIRECT.

Любые комментарии будут оценены.

Ответы [ 5 ]

1 голос
/ 04 ноября 2019

Просто для удовольствия.

Это можно сделать с помощью базовой формулы Excel, если вы действительно больше не хотите смотреть на формулу и не заботитесь о производительности.

How it looks in Excel

А вот и все используемые формулы

=FIND(";" & B4 &";";";" & B2 & ";")
=LEFT(B2;C6)
=LEN(C7)-LEN(SUBSTITUTE(C7;";";""))
=SUBSTITUTE(B3;";";"|";C8)
=FIND("|";C9)
=FIND(";";B3&";";C10+1)
=MID(C9;C10+1;C11-C10-1)

=MID(B3;FIND("|";SUBSTITUTE(B3;";";"|";LEN(LEFT(B2; FIND(";" & B4 &";";";" & B2 & ";")))-LEN(SUBSTITUTE(LEFT(B2; FIND(";" & B4 &";";";" & B2 & ";"));";";""))))+1;FIND(";";B3&";";FIND("|";SUBSTITUTE(B3;";";"|";LEN(LEFT(B2; FIND(";" & B4 &";";";" & B2 & ";")))-LEN(SUBSTITUTE(LEFT(B2; FIND(";" & B4 &";";";" & B2 & ";"));";";""))))+1)-FIND("|";SUBSTITUTE(B3;";";"|";LEN(LEFT(B2; FIND(";" & B4 &";";";" & B2 & ";")))-LEN(SUBSTITUTE(LEFT(B2; FIND(";" & B4 &";";";" & B2 & ";"));";";""))))-1)
1 голос
/ 04 ноября 2019

Поскольку вы пометили вопрос с помощью VBA, вы можете использовать UDF для получения значения.

Этот UDF получил три аргумента:

  1. Ячейка стран
  2. Ячейка оргов
  3. Страна, которую вы ищете

    Function GET_ORG(ByVal vCountries As Range, ByVal vOrgs As Range, ByVal vThisCountry As String) As String
    Dim Countries As Variant
    Countries = Split(vCountries.Value, ";")
    
    Dim Orgs As Variant
    Orgs = Split(vOrgs.Value, ";")
    
    Dim i As Byte
    
    For i = LBound(Countries) To UBound(Countries) Step 1
        If Countries(i) = vThisCountry Then Exit For
    Next i
    
    GET_ORG = Orgs(i)
    
    Erase Countries
    Erase Orgs
    
    End Function
    

Тест, который я сделал:

enter image description here

В ячейке D2 Моя формула =GET_ORG(A1;A2;D1)

1 голос
/ 04 ноября 2019

С макросом, написанным на VBA, все просто:

Option Explicit
Sub ExtractOrganization()
    Dim i As Long, countries As Variant, organizations As Variant, country As String
    ' take lists from cells and split them by ;
    countries = Split(Cells(1, 1), ";")
    organizations = Split(Cells(2, 1), ";")
    country = "BE"
    For i = LBound(countries) To UBound(countries)
        If countries(i) = country Then Exit For
    Next

    MsgBox organizations(i)
End Sub

А вот мои настройки листа:

enter image description here

1 голос
/ 04 ноября 2019

Если у вас Excel 2013 или выше, вы можете использовать подход FILTERXML, как показано @JvdV. Для всех версий вы можете использовать:

=LOOKUP(2,1/(TRIM(MID(SUBSTITUTE(";"&B2,";",REPT(" ",99)),ROW($A$1:$A$10)*99,99))=B4),TRIM(MID(SUBSTITUTE(";"&B3,";",REPT(" ",99)),ROW($A$1:$A$10)*99,99)))

Где

Ячейка B2 содержит RO; BE; AU; CN; DE; UK; ES; HU; NL;SE; AT; EL; CZ Cell B3 содержит Org1;Org2;Org3 .. Ячейка B4 содержит ключ, который вы ищете, например, RO.

Предполагается, что все записи в исходном списке являются уникальными и имеется 10 записей, которые нужно разделить. Если у вас есть больше, вам нужно изменить ROW($A$1:$A$10) на максимальное количество записей в соответствии с вашим делом, как ROW($A$1:$A$99) и т. Д.

0 голосов
/ 04 ноября 2019

Используя SPLIT, MATCH & INDEX в формулах Excel, вы можете получить его

FORMULA

=INDEX(SPLIT(B2, ";"), MATCH(B3, SPLIT(B1, ";")))

ПРИМЕР:

Применить приведенную выше формулу в ячейке B4

    A               B

1   COUNTRIES       A;B;C;D;E
2   ORG             Org1;Org2;Org3;Org4;Org5
3   Search CODE     B
4   Result          Org2 (=INDEX(SPLIT(B2, ";"), MATCH(B3, SPLIT(B1, ";"))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...