简体   繁体   中英

split string in cell when specific word found in excel

I am working of excel sheet contain 1000 entries. I had phone number and email in one cell I want to separate them.
I use Data tab option but some rows have , to separate and some rows have space to separate Telephone and email.

Data in Column B is same as

Tel.: 05164 / 801623 Mobil: 0171 / 2337496 mail: Irisahlden(at)web(dot)de

E-Mail: irj@gmail.com, Telefon: 3927-743627

Tele: 45937/28627 E-Mail: hurjd@hotmail.com


Is there any way that I separate Email and telephone in different cells?

You can split the numbers out of the cells by following this, you'll have to put some checks in there for your separators if you want them included. See: How to find numbers from a string?

The email addresses, you're best off searching for the "@" or "(at)" in the string, then taking all characters before and after, till a space is found. Or, to make it slightly easier for the search, replace all "(at)" and "(dot)" with "@" and ".". See: Check if a string contains another string

Hope this helps.

I took it as a challenge

try this

Option Explicit

Sub main()
Dim cell As Range
Dim iAt As Long, iDot As Long, iSpace As Long, iMail As Long, i As Long

'get wanted sheet column "B" cells with string values only
With Worksheets("MAIL_TEL").Columns("B").SpecialCells(xlCellTypeConstants, xlTextValues) '<== change "MAIL_TEL" with actual sheet name

    Application.DisplayAlerts = False
    .Replace what:=",", Replacement:=" ", lookAt:=xlPart, MatchCase:=False 'replace 'commas' (",") with 'spaces' (" ")
    .Replace what:="(dot)", Replacement:=".", lookAt:=xlPart, MatchCase:=False ' make sure having real 'dot's (".")
    .Replace what:="(at)", Replacement:="@", lookAt:=xlPart, MatchCase:=False ' make sure having real 'At's ("@")
    Application.DisplayAlerts = True

    'loop through cells to parse the position of "mail" info from other info ('telephone' info, as far as your data show)
    For Each cell In .Cells

        cell.Value = WorksheetFunction.Trim(cell.Value) 'remove multiple spaces

        iAt = InStr(cell.Value, "@") 'search for 'At' ("@") to check for 'mail' info
        If iAt > 0 Then
            iMail = InStr(UCase(cell.Value), "MAIL") 'search for "mail"
            iSpace = InStrRev(Left(cell.Value, iMail - 1), " ") 'search for the 'space' (" ") preceeding "mail"
            If iSpace > 0 Then '"mail" was not the first "info" -> place the "|" separator
                cell.Value = Mid(cell.Value, 1, iSpace) & "|" & Mid(cell.Value, iSpace + 1, Len(cell.Value) - iSpace) ' insert the "|" separator
            Else '"mail" was the first "info" -> search for the second "info" and place the "|" separator before it
                iDot = iAt + InStr(Right(cell.Value, Len(cell.Value) - iAt), ".") 'search for first 'dot' (".") after 'At' ("@"), to get near to the 'mail' info end
                iSpace = InStr(Right(cell.Value, Len(cell.Value) - iDot), " ") ' check for some more info at the left of 'mail' one (it should be separated by a 'space')
                If iSpace > 0 Then cell.Value = Mid(cell.Value, 1, iDot + iSpace - 1) & "|" & Mid(cell.Value, iDot + iSpace, Len(cell.Value) - (iDot + iSpace - 1))  ' if any more 'info' present, then insert the "|" separator
            End If
        End If

    Next cell

    'remove possible 'spaces' (" ") before or after "|" separator
    Application.DisplayAlerts = False
    .Replace what:=" |", Replacement:="|", lookAt:=xlPart, MatchCase:=False
    .Replace what:="| ", Replacement:="|", lookAt:=xlPart, MatchCase:=False
    Application.DisplayAlerts = True

    'parse info into two columns
    .TextToColumns Destination:=.Range("A1"), DataType:=xlDelimited, _
    TextQualifier:=xlSingleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
    Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar:="|"

'   keep 'Mail' info in first column and other info ('Tel') in second one
    Call ProcessData(.Cells, "MAIL")


    'now process the 'other' info column, in much the same way as done above
    With .Offset(, 1)

        'place "|" separator to mark possible 'Mobile' and 'Tel' info
        Application.DisplayAlerts = False
        .Replace what:="mobil", Replacement:="|Mobil", lookAt:=xlPart, MatchCase:=False 'Mark the 'Mobile' info, if any
        .Replace what:="tel", Replacement:="|Tel", lookAt:=xlPart, MatchCase:=False 'Mark the 'Tel' info, if any
        Application.DisplayAlerts = True

        'remove "|" separator if first character
        For Each cell In .Cells
            If Left(cell.Value, 1) = "|" Then cell.Value = Right(cell.Value, Len(cell.Value) - 1)
        Next cell

        'parse info into two columns
        .TextToColumns Destination:=.Range("A1"), DataType:=xlDelimited, _
        TextQualifier:=xlSingleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar:="|"

    '   keep 'Mobile' info in first column and other info ('Telephone') in second one
        Call ProcessData(.Cells, "MOB")

    End With

End With

End Sub

Sub ProcessData(dataRng As Range, keyStrng As String)
Dim data() As String
Dim j1 As Long, j2 As Long, i As Long
Dim cell As Range

    'fill Data() array with passed cells content keeping 'keyStrng' info in its first column and other info in its second column
    With dataRng.Resize(, 2)
        ReDim data(1 To .Rows.Count, 1 To 2)
        'loop through all their rows
        For i = 1 To .Rows.Count
            Set cell = .Rows(i).Find(what:=keyStrng, lookAt:=xlPart, LookIn:=xlValues, MatchCase:=False) 'search for 'mail' info
            If Not cell Is Nothing Then
                j1 = cell.Column - .Columns(1).Column + 1
                j2 = IIf(j1 = 1, 2, 1)
                data(i, 1) = .Cells(i, j1)
                data(i, 2) = .Cells(i, j2)
            Else
                data(i, 2) = .Rows(i).Range("A1")
            End If
        Next i
        .Cells = data
        .Columns.AutoFit
    End With

End Sub

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM