2015-10-16 4 views
0

У меня есть три части данных в ячейке, которые я хотел бы разделить. Сейчас мои клетки выглядят примерно так со всеми различными позициями, электронные письма и телефонные номера:Сплит неравномерные данные

enter image description here

Я хотел бы мои данные, чтобы выглядеть следующим образом:

enter image description here

Ищу для любой формулы Excel или кода VBA, чтобы сделать это возможным. Я думал, что может быть какая-то комбинация MID, LEFT, RIGHT и FIND, но я не могу понять, что это правильно.

+0

Есть ли разделитель между каждой части данных? – laylarenee

ответ

0

ОК. Это вид длинных формул, поэтому лучше всего их скопировать и вставить.

Предположим, что ваши данные начинаются в ячейке A2.

В ячейке B2 введите следующую формулу:

=SUBSTITUTE(A2,MID(A2,FIND("|",SUBSTITUTE(A2," ","|",LEN(A2)-LEN(SUBSTITUTE(A2," ",""))-3)),99),"") 

В ячейке C2 введите следующую формулу:

=SUBSTITUTE(MID(A2,FIND("|",SUBSTITUTE(A2," ","|",LEN(A2)-LEN(SUBSTITUTE(A2," ",""))-3))+1,99),MID(A2,FIND("|",SUBSTITUTE(A2," ","|",LEN(A2)-LEN(SUBSTITUTE(A2," ",""))-2)),99),"") 

В ячейке D2 введите следующую формулу:

=SUBSTITUTE(MID(A2,FIND("|",SUBSTITUTE(A2," ","|",LEN(A2)-LEN(SUBSTITUTE(A2," ",""))-2))+1,99),MID(A2,FIND("|",SUBSTITUTE(A2," ","|",LEN(A2)-LEN(SUBSTITUTE(A2," ",""))-1)),99),"") 

В ячейку E2, введите эту формулу:

=MID(A2,FIND("|",SUBSTITUTE(A2," ","|",LEN(A2)-LEN(SUBSTITUTE(A2," ",""))-1))+1,99) 

Теперь выберите диапазон B2: E2 и скопируйте вниз, насколько вам нужно.

Все.

+0

Это прекрасно работает! благодаря! – eee8036

+0

Добро пожаловать! –

0

версия VBA (весь текст в колонке А)

Option Explicit 

Public Sub customSplit() 
    Dim part1, part2, part3, cel As Range, v As Variant, i As Long 

    With ActiveSheet.UsedRange 
     v = .Columns("A:E") 
     For i = 1 To ActiveSheet.UsedRange.Rows.Count 
      If Len(v(i, 1)) > 0 Then 
       part1 = InStr(v(i, 1), "@") 
       If part1 > 0 Then 
        part2 = InStrRev(v(i, 1), " ", part1) 
        part3 = Split(Right(v(i, 1), Len(v(i, 1)) - part2)) 
        If UBound(part3) = 3 Then 
         v(i, 2) = Left(v(i, 1), part2 - 1) 
         v(i, 3) = part3(0) 
         v(i, 4) = part3(1) 
         v(i, 5) = part3(2) & " " & part3(3) 
        End If 
       End If 
      End If 
     Next 
     With .Columns("A:E") 
      .Value = v 
      .AutoFit 
     End With 
    End With 
End Sub 

Всего строк: 1048576; Продолжительность: 13.625 секунды

Пример результата:

Associate Professor [email protected] 777-123-4567 GWC 123   Associate Professor   [email protected] 777-123-4567 GWC 123 
Business Operation Specialist [email protected] 777-456-7890 GWC 456 Business Operation Specialist [email protected] 777-456-7890 GWC 456 
Associate Professor jane.doeexample.com 777-123-4567 GWC 124 
Business Operation Specialist [email protected] 777-456-7890 457 
Associate Professor [email protected] 777-123-4567 GWC 125   Associate Professor   [email protected] 777-123-4567 GWC 125 
Associate Professor [email protected] 777-123-4567 GWC 124   Associate Professor   [email protected] 777-123-4567 GWC 124 
Business Operation Specialist [email protected] 777-456-7890 GWC 457 Business Operation Specialist [email protected] 777-456-7890 GWC 457 
+0

Спасибо за код! Это вызывает ошибку, когда вы устанавливаете part2 = InStrRev ... говоря «Ошибка времени выполнения» 5: Неверный вызов или аргумент процедуры » – eee8036

+0

Эта ошибка возникает, когда исходные данные не содержат знак' @ '(адрес электронной почты). Я добавил валидацию, чтобы проверить шаблон источника для «word x N +» «+ email +» «+ phone +» «+ word x 2' –

Смежные вопросы