2014-09-17 4 views
3

Скажем, у меня есть следующий текст строки в одной ячейке Excel:Удалить дубликаты в ячейке Excel

John John John Mary Mary 

Я хочу, чтобы создать формулу (так что никаких функций меню или VBA, пожалуйста), что дало бы мне, на другая ячейка

John Mary 

Как это сделать?

То, что я пробовал до сих пор, - это поиск в Интернете, и о проблеме, и все, что я мог найти, - это решения, связанные с удалением дубликатов Excel, или с участием countif и заменой дубликатов для "". Я также рассмотрел список функций Excel, особенно те из категории «Текст», но не смог найти ничего интересного, что можно было бы сделать в одной ячейке.

+1

Что у вас пытался? Какой подход вы принимаете? Решить эту проблему с помощью VBA является тривиальная проблема; не так просто с просто формулами. Возможно, вы сможете сделать это с помощью вспомогательных столбцов. –

+0

@RonRosenfeld, я обновлю Q своими пугающими попытками решить проблему. –

+0

Я могу оценить необходимость использования только формул, но могу ли я спросить, почему вы не можете использовать какой-либо VBA для этого с помощью макроса, прикрепленного к фигуре или кнопке на листе? Мне просто интересно. Даже событие, встроенное в рабочий лист. хмм? – peege

ответ

0

Как я уже писал, тривиально решать с VBA. Если вы не можете использовать VBA, одним из методов является использование вспомогательных столбцов.

Допустим: Ваша строка в A1

Введите следующие формулы:

C1: =IFERROR(INDEX(TRIM(MID(SUBSTITUTE($A$1," ",REPT(" ",99)),(ROW(INDIRECT("1:" & LEN($A$1)-LEN(SUBSTITUTE($A$1," ",""))+1))-1)*99+((ROW(INDIRECT("1:" & LEN($A$1)-LEN(SUBSTITUTE($A$1," ",""))+1))=1)),99)),ROWS($1:1),1),"") 

D1: =IF(COUNTIF(C1:$C$5,C1)=1,C1,"") 

Выберите C1 и D1 и заполнить вниз, пока вы не начнете получать заготовки

E1: =D1 
E2: =TRIM(CONCATENATE(D2," ",E1)) 

Выберите E2 и заполнить вниз.

Содержимое последней ячейки, заполненной в столбце E, будет вашим результатом.

Если вы хотите иметь ячейку, которая автоматически возвращает содержимое последней ячейки в столбце диапазона E, вы можете использовать формулу, как:

=LOOKUP(REPT("z",99),$E$1:$E$100) 
+0

Спасибо, Рон. Это, похоже, не работает из-за коробки для моего реального дела, но я еще раз подумаю. –

+0

@WaldirLeoncio Он работает с данными вашего образца. Если ваш образец не является репрезентативным, отредактируйте исходный вопрос, чтобы предоставить информацию о сбоях. –

0

Без формулы: Текст по столбцам с пространством, что и разделитель, транспонирование вывода, применить Удалить дубликаты к каждому столбцу отдельно, а затем перенести результат.

+0

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

0

Предполагая, что вы никогда не будете иметь более двух различных названий в клетке, это должно работать:

=MID(A1&" ",1,FIND(" ",A1&" "))& 
MID(SUBSTITUTE(A1&" ",MID(A1&" ",1,FIND(" ",A1&" ")),"")&" ",1, 
FIND(" ",SUBSTITUTE(A1&" ",MID(A1&" ",1,FIND(" ",A1&" "))&" ",""))) 

Он покажет John Mary для всех из них:

John John John Mary Mary 
John Mary 
John Mary John Mary 
John Mary Mary 
John John Mary 

Он покажет John для всех этих:

John 
John John 
John John John 

И это покажет ничего, если A1 пуст.

+0

Это работает для двух разных имен. Я посмотрю, могу ли я обобщить его на потенциальные 16 имен. Благодаря! –

+1

Эта конкретная стратегия получилась бы очень волосатой для 3 имен, и вы можете столкнуться с некоторыми ограничениями Excel задолго до того, как получите 16 имен. Это в основном рекурсивный алгоритм: A) захватить первое слово, B) удалить его из остальной части строки, C) объединить A и B, [повторить шаги A-C по результатам этапа B, ...]. Ваш вопрос подчеркивает слабость строковых операций Excel. (В частности, неспособность использовать регулярные выражения.) Кроме того, отсутствие Excel в функции, подобной eval, затрудняет такую ​​вещь, не прибегая к VBA или использующим «скрытые» ячейки. –

+0

@RickHitchcock есть ли способ сделать это без конечной запятой и до трех уникальных строк? – Devil07

2

Ответ здесь: https://www.extendoffice.com/documents/excel/2133-excel-remove-duplicate-characters-in-string.html

Function RemoveDupes2(txt As String, Optional delim As String = " ") As String 
Dim x 
'Updateby20140924 
With CreateObject("Scripting.Dictionary") 
    .CompareMode = vbTextCompare 
    For Each x In Split(txt, delim) 
     If Trim(x) <> "" And Not .exists(Trim(x)) Then .Add Trim(x), Nothing 
    Next 
    If .Count > 0 Then RemoveDupes2 = Join(.keys, delim) 
End With 
End Function 

Поместите код, указанный выше в модуле

Использование =remove(A2,",") A2 содержит повторен текст разделены, Вы можете изменить разделитель

+0

Это не сработало для меня, для чисел из 13 символов. – Devil07

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