Страницы: 1
RSS
Как удалить повторяющиеся значения внутри строк?!
 
Господа! Выручайте!    
Сразу скажу, что искал, но не нашёл...  
 
Ситуация такая: Есть такая таблица  
Столбец с ячейками. Каждое предложение внутри ячейки.  
 
Мама мыла раму, раму.  
Папа мыл маму 3, папа.  
Вася сидел и смотрел, Сидел  
Кошка 345 бежала, 345  
 
Бред, но как ещё пояснить не знаю. Короче, нужно убрать повторяющиеся слова или цифры. Каждый раз эти повторяющиеся значения в разных местах, и длинна предложения разная. Повторы ни какими знаками не отделяются.    
Сразу оговорюсь что в Excel рядовой пользователь.    
 
Нужно получить соответственно:  
Мама мыла, раму.  
мыл маму 3, папа.  
Вася и смотрел, Сидел  
Кошка бежала, 345  
 
В идеале нужно убрать первое из повторяющихся слов, т.к последнее стоит в конце предложения и отделено запятой и это поможет при дальнейшей фильтрации.
 
Формулой если, то у меня трёхэтажная получается. Подойдёт?
 
UDF, т.е. макросы должны быть разрешены.
 
Так?
 
Так?  
 
 
К сообщению прикреплен файл: post_363447.xlsx  
 
Да! Так! Спасибо огромное!  
Теперь бы осознать как эту формулу в мою таблицу перенести... Мозг рвётся на куски :))
 
Не думаю, что у меня оптимальный вариант, но на всякий случай прикладываю.
 
Простите, моя формула "жрёт" текст после последнего пробела, если нет задвоения. :о((
 
Народ!    
ShAM написал отличную формулу! Всё работает, НО! После 150 строики пропадают значения после запятой!
 
И ещё съедает значения если оно в предложении без повтора... :(
 
А ещёёёёё.... Задача усложняется тем, что значение может повторяться с пробелом или без  
GDB 1583   TRW  ,Колодки торм., GDB1583  
GDB1583   TRW  ,Колодки торм., GDB 15 83  
 
Извиняюсь, сам не сразу заметил
 
Скажите, а удаляемый текст всегда будет полностью после запятойб т.е. всё, что после последней запятой ищем и удаляем.Так?
 
Да, в точку!
 
да, и ещё к этому два условия, которые забыл упомянуть:  
1. После ПОСЛЕДНЕЙ запятой (кстати, м.б. что-нить типа <<абвгд, 0,4 мм>>, где нужно удалить <<0,4 мм>>)? Я к тому, можно ли считать последнюю запятую неким ключевым символом или нет?  
2. Удаляем только в случае наличия повторения во фразе фрагмента.
 
1. такого формата как 0,4 мм в тексе после запятой нет. Там буквенно числовые значения разделяемые / или -  
Правда бывает разный регистр. Т.е. в начале может быть АБВГД123 а в конце после запятой АбвГд-123 или абвгд/123 или аБВГД 123.  
 
2.Да.
 
У Вас офис 10-ка или моложе. Просто от этого зависит количество вложений
 
Function ЧистаяРама(ByVal Грязная_рама As String)  
   Const Commas As String = ",.;:!?"  
   Dim W1s() As String, W2s() As String, W As String, N1 As Long, N2 As Long, K As Long  
   '  
   Грязная_рама = Trim(Грязная_рама)  
   If Грязная_рама = "" Then  
       ЧистаяРама = Грязная_рама  
       Exit Function  
   End If  
   W1s = Split(Грязная_рама)  
   N1 = (Len(Грязная_рама) + 1) \ 2  
   ReDim W2s(1 To N1)  
   With New Collection  
       On Error Resume Next  
       For K = UBound(W1s) To 0 Step -1  
           W = W1s(K)  
           If InStr(1, Commas, Right(W, 1)) = 0 Then  
               .Add 0, LCase(W)  
           Else  
               .Add 0, LCase(Left(W, Len(W) - 1))  
           End If  
           If .Count > N2 Then  
               N2 = .Count  
               W2s(N1 - N2 + 1) = W  
           End If  
       Next  
       On Error GoTo 0  
   End With  
   ЧистаяРама = Trim(Join(W2s, " "))  
End Function
 
У меня Mac. Excel 14.2.3
 
>>А ещёёёёё.... Задача усложняется тем, что значение может повторяться с пробелом или без  
GDB 1583 TRW ,Колодки торм., GDB1583  
GDB1583 TRW ,Колодки торм., GDB 15 83  
 
Извиняюсь, сам не сразу заметил<<  
Вроде, так работает (жуть, конечно) :)  
=ЕСЛИОШИБКА(СЖПРОБЕЛЫ(ПОДСТАВИТЬ(B3;ПРАВСИМВ(B3;ДЛСТР(B3)-ПРОСМОТР(100;1/(ПСТР(B3;СТРОКА(A$1:A$99);1)=",");СТРОКА(A$1:A$99))-(ПСТР(B3;ПРОСМОТР(100;1/(ПСТР(B3;СТРОКА(A$1:A$99);1)=",");СТРОКА(A$1:A$99))+1;1)=" "));;1));B3)
 
Кстати, проверку можно убрать:  
=СЖПРОБЕЛЫ(ПОДСТАВИТЬ(B3;ПРАВСИМВ(B3;ДЛСТР(B3)-ПРОСМОТР(100;1/(ПСТР(B3;СТРОКА(A$1:A$99);1)=",");СТРОКА(A$1:A$99))-(ПСТР(B3;ПРОСМОТР(100;1/(ПСТР(B3;СТРОКА(A$1:A$99);1)=",");СТРОКА(A$1:A$99))+1;1)=" "));;1))
 
В примере ", " (запятая с пробелом) только последняя.  
В таком случае простенькое (минусы - не убирает лишние пробелы, убирает искомое, если его дубль не найден):  
=ПОДСТАВИТЬ(B3;ПСТР(B3;ПОИСК(", ";B3&" ")+2;20);;1)  
 
Немного сложнее (убирает  лишние пробелы, оставляет искомое, если его дубль не найден):  
=СЖПРОБЕЛЫ(ПОДСТАВИТЬ(B3;ПСТР(B3;ПОИСК(", ";B3&" ")+2;20);))&ПСТР(B3;ПОИСК(", ";B3&" ")+1;20)  
 
Со всякими тире/пробелами хуже. Судя по показанному:  
>>GDB 1583 TRW ,Колодки торм., GDB1583  
>>GDB1583 TRW ,Колодки торм., GDB 15 83,  
неправильная запись может быть как в первом, так и во втором вхождении искомого.  
Есть ли все (или хотя бы основные) варианты неправильных записей? Например:  
варианты АА11: АА-11, АА 11  
варианты ААА1111: ААА 11 11, ААА 1111
 
Регулярная борьба с пробелами :))  
 
Dim re As Object  
 
Function Zmey(s As String) As String  
Dim s1$, s2$, i&, ptrn$, s3$  
i = InStrRev(s, ",")  
If i Then  
   s1 = Left$(s, i)  
   s2 = Mid$(s, i + 1)  
   s3 = Replace$(s2, " ", "")  
   For i = 1 To Len(s3)  
       ptrn = ptrn & " ?" & Mid$(s3, i, 1)  
   Next  
   ptrn = Mid$(ptrn, 3)  
   If re Is Nothing Then Set re = CreateObject("vbscript.regexp")  
   re.Pattern = ptrn  
   Zmey = Application.Trim(re.Replace(s1, "")) & s2  
Else: Zmey = s  
End If  
End Function
 
Алексей, поздним связыванием создаём ссылку (пример из Вашего примера):  
Dim re As Object  
........................  
Set re = CreateObject("vbscript.regexp").  
В VB/VBA-руководствах, в этом случае, рекомендуют по выходе из макроса  
разрывать связь с внешней библиотекой, присваивая этой Object-переменной значение Nothing.  
В каких случаях это действительно необходимо делать ?  
Я каждый раз тупо пишу:  
....  
Set XYZ = Nothing  
End Sub,  
и думаю - а оно обязательно надо ?
 
По моим наблюдениям, "сборщик мусора" в VBA работает вполне надежно: объект уничтожается, как только ни одна переменная не содержит ссылку на него.  
Если в Вашем случае XYZ - переменная этой процедуры и она не объявлена как Static, переменная исчезнет при End Sub, а вместе с ней - объект.  
В моем случае я намеренно объявил переменную re в модуле, чтобы она сохранялась (и вместе с ней объект) между вызовами функции - чтобы не создавать объект каждый раз. Здесь объект существует, пока открыта книга, или пока проект VBA не перекомпилирован.  
 
Другое дело - если объект является самостоятельным приложением. Тогда объектная переменная указывает на некий интерфейс приложения (API), который существует автономно. Вот пример:  
 
Sub dd()  
Dim a As Object, b As Object, c As Object, d As Object  
1 Set a = CreateObject("vbscript.regexp")  
2 Set b = GetObject(, "vbscript.regexp") 'Error 429  
 
3 Set c = CreateObject("word.application")  
4 Set d = GetObject(, "word.application")  
5 Debug.Print c Is d 'True  
6 Debug.Print c.Name 'Microsoft Word  
7 c.Quit  
8 Debug.Print c Is Nothing 'False  
9 Debug.Print c Is d 'True  
10 Debug.Print c.Name 'Error 462  
 
End Sub  
 
1,2 - создаем "простой" объект, пытаемся подключиться к его интерфейсу - не получается.  
3,4 - создаем объект-приложение, подключаемся к его интерфейсу. Теперь переменные c,d указывают на один и тот же объект (5).  
_Примечание:_ до этого Word не должен быть запущен. Команда (4) подключит переменную к любому из экземпляров запущенного приложения, если их несколько.  
7 - завершение приложения.  
8 - Но переменная продолжает указывать на нечто (интерфейс?).  
10- Однако, свойства объекта уже недоступны.  
 
Если в данном случае выполнить команды  
Set c=Nothing: Set d=Nothing  
, но не выполнить c.Quit, то связь с объектом будет разорвана, НО приложение останется работать и занимать память - это видно в диспетчере задач.  
Так что разрывать связь ИМХО необязательно, а вот завершать приложение - очень важно.
 
Алексей, спасибо (отдельно за дополнение).  
Понял, что ссылки на не интерфейсные объекты можно явно не удалять.  
[ если это не расчёт пилотируемого полёта на Луну :-) ]
 
\
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Что-то как-то совсем ни чего не понятно стало...Похоже решение данного вопроса путём написания формулы - задача мне непосильная. Ни слова уже не понимаю что Вы пишите))))
 
Те, кто ниже меня - они издеваются. Да! Они о макросах все :)  
О формулах - я последний. В чем не разобрались?
Страницы: 1
Читают тему
Loading...