Извлечь часть строки на основе значения другого - PullRequest
0 голосов
/ 09 марта 2020

Я хочу извлечь часть строки на основе условия для другой строки в другой ячейке в большом наборе данных. У меня есть:

V1                 V2
Tom Cruise         Tom Cruise (movie 1), Al Pacino (movie 2), Johnny Depp (movie 5)
Johnny Depp        Tom Bennet (movie 3, movie 4), Johnny Depp (movie 5)
Emma Watson        Al Pacino (movie 8), Emma Watson (movie 1, movie 3), Antony B. (movie 5)

И мне нужно создать новое поле, основанное на V1, и оно будет сообщать текст в скобках рядом с именем из V1. Полученный набор данных должен иметь:

V1                 V2                                                                           V3
Tom Cruise         Tom Cruise (movie 1), Al Pacino (movie 2), Johnny Depp (movie 5)             movie 1
Johnny Depp        Tom Bennet (movie 3, movie 4), Johnny Depp (movie 5)                         movie 5
Emma Watson        Al Pacino (movie 8), Emma Watson (movie 1, movie 3), Antony B. (movie 5)     movie 1, movie3

Я пробовал комбинацию функции = ВЛЕВО и НАЙТИ, но все равно получаю ошибку.

=LEFT(V1, FIND( " (", V2))

Ответы [ 3 ]

1 голос
/ 09 марта 2020

В C2 формула скопирована:

=MID(B2,FIND(A2,B2)+LEN(A2)+2,FIND(")",B2,FIND(A2,B2))-FIND("(",B2,FIND(A2,B2))-1)

enter image description here

1 голос
/ 09 марта 2020

Уродливая одношаговая формула (может быть красивым решением):

=MID(B2,FIND("), "&A2&" (","), "&B2)+LEN(A2)+2,FIND(")",B2,FIND("), "&A2&" (","), "&B2)+1)-FIND("), "&A2&" (","), "&B2)-LEN(A2)-2)

Но обычно для такого случая лучше использовать регулярное выражение, чтобы помочь ...

Сначала вам нужно подготовить функцию VBA с регулярным выражением. В справочнике VBA добавьте «Регулярное выражение Microsoft VBScript 5.5». Затем добавьте это в некоторый файл .xlam, который вы будете продолжать использовать как плагин Excel, или поместите локально в книгу .xlsm.

Public ThisRE As New RegExp

Public Function ReplaceRE(ByVal FromStr As String, ByVal PatternStr As String, ByVal ByStr As String) As String
'$1 as first bracket
    ThisRE.Pattern = PatternStr
    ThisRE.Global = True
    ReplaceRE = ThisRE.Replace(FromStr, ByStr)
End Function

Формула для использования обычной express:

=ReplaceRE(B3,"^.*(^|, )"&A3&" \(([^)]+)\).*","$2")

enter image description here

0 голосов
/ 09 марта 2020

Это немного более надежный подход с точки зрения избежания проблемы совпадения подстроки, которая предполагает, что ваши данные так же непротиворечивы, как вы показали.

=TRIM(LEFT(SUBSTITUTE(TRIM(MID(SUBSTITUTE(V2,V1&" (",REPT(" ",99)),99,99)),")",REPT(" ",99)),99))

измените V1 и V2 как за фактический макет.

...