Страницы: 1
RSS
Удаление из ячейки определенных слов если ячейка содержит
 
Помогите решить на VBA  
 
Удалить из ячейки определенные слова если ячейка содержит слово  
 
Исходный текст  "листок корень дерево трава ветка листочек земля"  
 
если ячейка содержит "дерево" удалить из ячейки "листок, ветка, листочек"  
 
конечный результат  "корень дерево трава земля"
 
-Помощь студентам - Форум программистов http://www.programmersforum.ru/forumdisplay.php?s=&daysprune=-1&f=31  
- Фриланс - Форум программистов http://www.programmersforum.ru/forumdisplay.php?s=&daysprune=-1&f=29  
- Фриланс - Форум программистов и сисадминов CyberForum.ru http://www.cyberforum.ru/freelance/
 
Помогите решить макросом  
 
Удалить из ячейки определенные слова если ячейка содержит слово  
 
Исходный текст "листок корень дерево трава ветка листочек земля"  
 
если ячейка содержит "дерево" удалить из ячейки "листок, ветка, листочек"  
 
конечный результат "корень дерево трава земля"
 
{quote}{login=pash}{date=12.06.2012 09:02}{thema=}{post}Помогите решить макросом...{/post}{/quote}  
Похожая ситуация - http://www.programmersforum.ru/showthread.php?t=204664
 
Не то, нужен макрос
 
ну так и там тоже был нужен макрос.  
и тоже нахаляву.  
и тоже автор писал "помогите мне", а не "сделайте за меня, потому что мне лень, на дворе лето, девочки и пиво. и мне гулять охота, а не VBA изучать и зачеты/экзамены сдавать".  
 
полностью аналогичная ссылка.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
нужно что то типа, у меня массив 50 000 из которого автоматически надо удалить слова если ячейка содержит слово.    
   
Удаление   из   ячейки  определенного набора символов    
Есть текст в ячейке:  
Фрукт/ Apple" 123=  
 
Нужно чтобы стало:  
Apple123  
   
Sub ReplaceSymbols()  
Dim objRegExp As Object, sOlsString As String, sNewString As String  
sOlsString = "Фрукт/ Apple"""" 123="  
Set objRegExp = CreateObject("VBScript.RegExp")  
objRegExp.Global = True: objRegExp.IgnoreCase = True  
objRegExp.Pattern = "["""",\=,,\/, а-я,ё]"
sNewString = objRegExp.Replace(sOlsString, "")  
End Sub
 
Помогите кто может очень нужно для работы, я с макросами не знаком.
 
Мало информации.  
Давайте по правилам - пример, что есть, как надо.  
А то иначе Ctrl+H и 3 раза замена, записать в макрос (или не записывать, нафига, если работа уже сделана?)
 
Прикладываю файл, то что необходимо получить, после обработки массива  
Заранее спасибо за помощь
 
Офигеть...  
А начинали "листок, ветка, листочек" :)  
Вопрос требует времени, которого нет... не на 5 минут задачка.
 
Задачка интересная.  
Критерии отбора могут меняться/дополняться?  
Работа не разовая?  
Если ответы ДА, то есть мысли... с учётом объёма, должно быть сравнительно быстро.  
Для разовой задачи можно сделать проще и медленнее.  
Но сейчас писать некогда.  
Если есть интерес - напишите на почту (внизу замаскирована, на nxt), через неделю могу заняться :)
 
"не 5 минут" свободных было, набросал пока вот так.  
но немного сомневаюсь - сейчас условия проверяются все и независимо друг от друга.  
возможно, логика подразумевается несколько иная.  
и я даже могу догадаться - какая, но хотелось бы услышать ТС.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
У меня есть мысль вообще не использовать InStr() и Replace(), т.к. не отслеживается слово целиком.  
В общем, словари и массивы, массивы и словари :)
 
Hugo, я бы с большим интересом посмотрел на твою реализацию этой задачи со словарями - ибо пока я такой необходимости не вижу, что называется, "в упор". :(
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Некогда сейчас.  
Но файлик отложил, и написал в нём себе такую памятку (может позже займусь):  
 
для каждой строки создаём свой словарь!  
сперва бъём строку в массив, проверяем каждое слово на наличие в словаре критериев, собираем словарь удаления.  
затем снова проход по массиву - перекладываем нужные в новую строку.  
 
А необходимость может возникнуть, если например    
"если ячейка содержит PG1C" - а в ячейке GPG1C или PG1CM... и аналогично при замене.
 
Дмитрий, я думаю надёжнее замену делать не заменой, а отбором :)  
Т.е. проверяем каждое слово на отсутствие в словаре исключений, отбираем нужные в новый массив.  
Как по скорости - не знаю, может Replace и будет быстрее, но зато гарантированно не будет накладок.
 
с латиницей можно так  
 
Sub example()  
   Dim text As String  
   text = "GPG1C PG1C PG1CM"  
   text = ReplaceRE(text, "PG1C")  
End Sub  
 
 
Private Function ReplaceRE(ByRef expression As String, _  
                         ByRef find As String, _  
                         Optional ByRef replace As String) As String  
   Static re As Object  
   If re Is Nothing Then  
       Set re = CreateObject("vbscript.regexp")  
   End If  
   re.pattern = "\b" & find & "\b"  
   ReplaceRE = re.replace(expression, replace)  
End Function
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Во, це дило :)  
 
Sub example()  
   Dim text As String  
   text = "GPG1C PG1C 1CM PG1CM"  
   text = Application.Trim(ReplaceRE(text, "PG1C 1CM"))  
   MsgBox text  
End Sub  
 
 
Private Function ReplaceRE(ByRef expression As String, _  
                          ByRef find As String, _  
                          Optional ByRef replace As String) As String  
   Static re As Object  
   Dim f  
   If re Is Nothing Then  
       Set re = CreateObject("vbscript.regexp")  
   End If  
   For Each f In Split(find)  
       re.Pattern = "\b" & f & "\b"  
       expression = re.replace(expression, replace)  
   Next  
   ReplaceRE = expression  
End Function  
 
 
Можно прикрутить...
 
Дмитрий, я думаю о том, как обезопаситься и от нахождения в тексте того, чего нет, и от удаления того, чего не нужно.  
Т.е. если вдруг будут слова, содержащие в себе искомые подстроки.  
В примере такого вероятно нет (хотя чтоб точно определить, проще код по нахождению этого написать :))
 
ОГРОМНОЕ СПАСИБО!!! ВСЕМ КТО ОТКЛИКНУЛСЯ !  
 
Вариант The_Prist работает так как я и хотел чтобы он работал. обрабатывает именно тот столбец который нужен, и можно задать большой список соответствий при этом он это делает довольно быстро.  
 
 
СПАСИБО!!!
 
{quote}{login=The_Prist}{date=14.06.2012 02:16}{thema=}{post}nerv, не совсем понял, как такая замена будет работать...может голова уже забилась или я что не так понимаю...Надо:  
-есть текст "B33 BM4 WB7 WS4 GBR PMSK 2W7 LLEL"  
-если в тексте встречается "PMSK", то удаляем из строки значения "B33 BM4 WB7 WS4 2W7"{/post}{/quote}  
все правильно, это я на солнце перегрелся : )  
 
p.s.: на почту опять не отвечаешь. Если не нужно, так и скажи. Надоедать я не буду. Неопределенность хуже всего )
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Александр, теперь я не понял - ты перегрелся? :)  
Мне кажется, что с RegExp как раз правильно, то что нужно получается.  
Я там ниже чуть поэксперементировал с удалением - как раз удаляет нужные слова и не калечит ненужные.  
Теперь ещё сперва аналогичный поиск прикрутить (целого слова, а не части) - и считай готов надёжный вариант.  
Но мне кажется, что на словаре всёж получилось бы быстрее - тут ведь тоже на каждый поиск нужна своя строка, или вернее по каждой строке нужно делать кучу поисков, потом кучу замен...
 
Дмитрий, да это синтетический пример, какая разница, что удалять.  
Главное, чтоб из "GPG1C PG1C" осталось "GPG1C", а не куцее "G", как после Replace.
 
Вот:  
 
Sub test()  
Dim s$  
s = "GPG1C PG1C"  
MsgBox s  
s = Replace(s, "PG1C", "")  
MsgBox s  
End Sub
 
можно добавить в начало-конец исходной строки по одному пробелу - и заменять так:  
s = Replace(s, " PG1C ", " ")  
искать - аналогично.  
после всех поисков/замен - убрать по одному пробелу в начале/конце строки.  
 
в принципе, в своем примерчике я что-то подобное начал делать, но до конца не додумал - добавлял только конечные пробелы.  
а теперь думаю - что, вкупе с начальными, всё должно получиться.  
 
останется вопрос сравнения по скорости.  
на 55000 строк.
фрилансер Excel, VBA - контакты в профиле
"Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
 
Да, с пробелами должно получиться. Но их нужно и к заменяемым прибавлять, а после замен всё равно application.trim нужен.
 
Хм, заменил средний критерий на  
P A B C D E F G  
получил из средней строки результат  
33 53 K2 Y0 68 W7 WWM L3 N K34 K1 P1 P1W P1 P1 PM22 KK0 S96 SR SSK 26 2 2W5 2Z 3  
Это ведь совсем не то, что должно было бы быть, если бы было так...
 
Вот тут пробелов не хватало.  
Так нужно, иначе в начале-конце не заменяет:  
    avArr(lr, lc) = Replace(" " & avArr(lr, lc) & " ", " " & sStr(le) & " ", "")  
 
Тогда да, работает.
 
по теме: регой сперва можно проверить, содержит ли строка нужную подстроку, а затем заменить. Для проверки есть метод Test  
 
The_Prist, все правильно, последнее письмо от 2-го числа: "Поиск не находит. Мне все равно, где он будет, главное чтобы сообщения успели загрузиться, т.е. были до него."
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
Страницы: 1
Читают тему
Наверх