Страницы: 1
RSS
Помогите, плз, разобраться (не удаляются строки)
 
Есть excel-файлик, в котором имеется 20 тыс. строк с тремя столбцами.  
Нужно удалить все те строки, где значение второго столбца не содержит слово "аккр".  
 
Написал макрос (вот фрагмент):  
     
num = ActiveSheet.UsedRange.Rows.Count  
 
For i = num To 2 Step -1  
 If Cells(i, 2).Value <> "*аккр*" Then Rows(i).Delete  
Next  
 
Не работает((  
 
В чем может быть дело, ума не приложу?
 
Может так?  
 
 
Sub Макрос1()  
Dim num As Long, i As Long  
   With Application  
       .ScreenUpdating = False  
       .Calculation = xlCalculationManual  
       num = ActiveSheet.UsedRange.Rows.Count  
       For i = num To 2 Step -1  
           If Not Cells(i, 2).Value Like "*аккр*" Then Rows(i).Delete  
       Next  
       .Calculation = xlCalculationAutomatic  
       .ScreenUpdating = True  
   End With  
End Sub
 
заработало, спасибо!))  
а почему, интересно, "not like" канает, а "<>" - нет (в последнем случае удаляется всё)?  
и как сделать так, чтобы условие было регистронезависимым (т.е. удалялось всё, что не равно "аккр", "АККР", "Аккр" и т.п.)
 
переводить сравниваемые строки в нижний регистр
 
или в верхний ;-)  
If Not UCase(Cells(i, 2).Value) Like "*АККР*" Then Rows(i).Delete  
 
а <> "не канает" потому что операции сравнения (в отличие от операции LIKE) НЕ ИСПОЛЬЗУЮТ ПОДСТАНОВОЧНЫЕ ЗНАЧКИ!  
т.о. Ваша запись <> "*аккр*"  удаляет все строки, в которых нет звёздочка потом буквы "аккр"  и ешё одна звёдочка...  
проверяется на совпадение именно с символом звёздочка...
 
по-моему, гораздо проще, а главное, быстрее здесь было бы воспользоватсья автофильтром:  
 
Columns("B").Select  
With Selection  
.AutoFilter Field:=2, Criteria1:="<>*аккр*"  
.EntireRow.Delete  
.AutoFilter Field:=2  
End With
 
А почему выбран метод цикла "снизу-вверх"?
 
наверное потому, что если сверху вниз удалять, то у последующих, после удаленных, строк будут изменяться номера.
 
Да, действительно, с автофильтром быстрее!)  
Тогда напрашивается вопрос - а за счет чего быстрее?  
Ведь наверняка внутри него тот же цикл с перебором используется
 
Уже отвечали на подобные вопросы, но понял только одно  
То что уже заложено разработчиками в Ехс, встроенные функции, - работает очень быстро. Пакетная(групповая) обработка тоже быстро. С ВБА мало того что код не скомпилирован (это так писали), а в данном случае еще самая медленная часть - обратиться к ячейке, сосчитать данные, выполнить необходимое действие....
 
{quote}{login=alibek}{date=04.10.2008 02:43}{thema=Re: Помогите, плз, разобраться (не удаляются строки)}{post}по-моему, гораздо проще, а главное, быстрее здесь было бы воспользоватсья автофильтром:  
 
Columns("B").Select  
With Selection  
.AutoFilter Field:=2, Criteria1:="<>*аккр*"  
.EntireRow.Delete  
.AutoFilter Field:=2  
End With{/post}{/quote}  
 
Изините чайника за глупый вопрос: а где это надо прописывать? В Insert Module не выходит...
 
Вставьте указанный код в тело макроса
Страницы: 1
Читают тему
Наверх