Извлечь слова из строки с разделителями в Excel? - PullRequest
4 голосов
/ 26 октября 2010

Мне нужно извлечь определенные слова между точкой с запятой с условием, что эти слова содержат «@», что означает электронную почту.

Вот пример:

A1 >> james john;Paris street;p.o. box:12345;tel.987654321;username@site.com;usa
B1 >> david eric;34th street;tel.543212345;name@web.net;canada;ottawa

... и т. Д.

Обратите внимание, что для электронной почты нет определенного места, поэтому оно может быть где угодно. Также нет общих слов или символов, кроме "@", поэтому должна быть формула для выбора между точкой с запятой + "@" для извлечения сообщения электронной почты и помещения его в A2 и B2 и т. Д.

Ответы [ 5 ]

2 голосов
/ 26 октября 2010
B1        =FIND("@",A1)
C1        =IF(ISERR(FIND(";",A1,B1)),LEN(A1)+1,FIND(";",A1,B1))
D1        =MAX(IF(ISERR(FIND(";",LEFT(A1,C1-1),ROW(INDIRECT("A1:A"&B1)))),0,FIND(";",LEFT(A1,C1-1),ROW(INDIRECT("A1:A"&B1)))))
E1        =MID(A1,D1+1,C1-D1-1)

Вы можете объединить их в одну суперформулу, если хотите.

B1 = the location of the at sign
C1 = the first semicolon after the @
D1 = the semicolon before the at sign (array entered)
2 голосов
/ 26 октября 2010

Скопировать данные в столбец A.
Выбрать данные.
Data -> Text to Columns...
Delimited (Next >)
Semicolon
Finish

Теперь у вас есть данные в столбцах A-F.

В G1 введите:

=INDEX(A1:F1,1,MATCH("~",IF(ISNUMBER(FIND("@",A1:F1)),A1:F1),-1))

и нажмите Ctrl + Shirt + Enter.Перетащите формулу вниз.

1 голос
/ 26 октября 2010

Вот функция VBA, которая использует регулярное выражение:

Function EmailFrom(source As String)

Dim Matches As Object

    With CreateObject("VBScript.RegExp")

        .Pattern = "(^|;)([^;@]+@[^;@]+);?"

        If .Test(source) Then
            Set Matches = .Execute(source)
            EmailFrom = Matches(0).SubMatches(1)
        Else
            EmailFrom = CVErr(xlErrNA)
        End If

    End With

End Function

[обновление] или даже (сжато)

Function EmailFrom(source As String)

    With CreateObject("VBScript.RegExp")
        .Pattern = "(^|;)([^;@]+@[^;@]+);?"
        With .Execute(source)
            If .Count > 0 Then
                EmailFrom = .Item(0).SubMatches(1)
            Else
                EmailFrom = CVErr(xlErrNA)
            End If
        End With
    End With

End Function
0 голосов
/ 17 января 2013

Существует простое выражение с разделителями, которое помогает разбивать строки в определенных точках разрыва. В этом случае точка с запятой - это точка, где вы хотите разорвать строку. Все, что вам нужно сделать, это нажать на DATA в верхнем меню, затем выбрать столбец с данными и затем выбрать TEXT TO COLUMN в верхней навигации. Он разделит ваши данные на указанные вами значения, а в вашем случае это точка с запятой, где вы хотите разделить свои данные.

Я пытался опубликовать снимки экрана, чтобы помочь, но детектор спама на этом сайте не позволяет мне. Но вы всегда можете посетить мой hubpage http://nikhilchandra.hubpages.com/ для того же. Надеюсь, это поможет: -)

0 голосов
/ 26 октября 2010

Мое быстрое предположение было бы написать функцию VBA, которая использует Regex, посмотрите http://www.vbforums.com/showthread.php?t=480272

...