Страницы: 1
RSS
Найти строки и удалить часть текста
 
Всем Здравствуйте!  
Помогите пожалуйста с макросом. Нужно по всему столбцу отыскать строки, которые содержат два определенных слова, и в отобранных строках удалить часть текста.  
 
Подробнее в файле-исходнике.  
 
Заранее благодарен!
 
Или я ..., или это недавно было, но только про курсив?
 
Попробуйте такой вариант:  
 
Sub Main()  
   Dim sh As Worksheet: Set sh = ActiveSheet  
   Dim cell As Range, ra As Range: Application.ScreenUpdating = False  
   Set ra = sh.Range(sh.[b7], sh.Range("b" & sh.Rows.Count).End(xlUp))
   For Each cell In ra.Cells  
       newtxt = УдалитьТекстМеждуСловами(cell, "грузов", "расстояние")  
       newtxt = УдалитьТекстМеждуСловами(newtxt, "км", "груза 1")  
       newtxt = Application.WorksheetFunction.Trim(Replace(newtxt, "груза 1", ""))  
       If newtxt <> cell.Text Then cell = newtxt  
   Next cell  
End Sub  
 
Function УдалитьТекстМеждуСловами(ByVal txt As String, ByVal txt1 As String, _  
                                 ByVal txt2 As String) As String  
   УдалитьТекстМеждуСловами = txt  
   pos1 = InStr(1, txt, txt1, vbTextCompare): If pos1 = 0 Then Exit Function  
   pos1 = pos1 + Len(txt1)  
   pos2 = InStr(pos1, txt, txt2, vbTextCompare): If pos2 = 0 Then Exit Function  
   УдалитьТекстМеждуСловами = Left(txt, pos1) & Mid(txt, pos2)  
End Function  
 
 
> Или я ..., или это недавно было, но только про курсив?  
Было...  
Пора нам уже привыкнуть к причудам форумчан :)
 
Пока делал макрос из предыдущего поста, столкнулся с интересной особенностью (или глюком), что заставило меня заменить строку  
 
Set ra = Range([b7], Range("b" & Rows.Count).End(xlUp))
 
на строки  
 
   Dim sh As Worksheet: Set sh = ActiveSheet  
   Set ra = sh.Range(sh.[b7], sh.Range("b" & sh.Rows.Count).End(xlUp))
 
 
Почему-то макрос в варианте Set ra = Range([b7], Range("b" & Rows.Count).End(xlUp))
обрабатывал не активный лист, а лист с именем Лист1, независимо от того, какой из листов был активен.  
Раньше никогда такого не было...  
 
Кто-нибудь сталкивался с таким поведением Excel?
 
А это не [ ] виноваты?
 
{quote}{login=Юрий М}{date=09.08.2009 10:50}{thema=}{post}А это не [ ] виноваты?{/post}{/quote}
 
Не, точно не в этом дело.  
Каждый день пишу десяток макросов по этому шаблону, и всё работает как надо.  
А тут долго не мог понять, почему макрос не работает, пока не вывел через debug.print полные адреса обрабатываемых ячеек...  
 
Видимо, какой-то косяк в самом файле.
 
Спасибо большое, EducatedFool!!!    
Макрос отлично работает. По поводу темы с курсивом, тоже моя тема. Просто хочется максимально автоматизировать работу, поскольку приходится обрабатывать огромные таблицы в короткие сроки. Сам я только недавно начал изучать VBA, поэтому приходится обращаться за помощью к профи.    
Еще раз спасибо Вам, и вашему форуму.
 
> А код макроса не в модуле Лист1 находился?  
 
Действительно, там...  
 
Я при необходимости написать макрос нажимаю Ctrl + R и потом Enter, и пишу код в том модуле, который откроется.  
В большинстве случаев им оказывается модуль первого листа книги.  
Но ранее таких проблем я ни разу не замечал...  
 
А что, конструкция Set ra = Range([b7], Range("b" & Rows.Count).End(xlUp)),
находясь в модуле какого-то листа, будет возвращать объекты типа Range из того же листа, а не из активного?  
Я-то думал, что  [b7] - это всегда ссылка на ячейку АКТИВНОГО листа, независимо от того, где находится код.
Страницы: 1
Читают тему
Наверх