Есть файл, где на листе Аномалии есть умная таблица. На другом листе кнопка.
Я написал цикл и повесил на кнопку, который удаляет все строчки, где встречается Недостача... Но что-то явно упустил, после цикла 1 строка остается нетронутой... Что там поправить нужно, подскажите?
Добрый день.
Есть файл, где на листе Аномалии есть умная таблица. На другом листе кнопка.
Я написал цикл и повесил на кнопку, который удаляет все строчки, где встречается Недостача... Но что-то явно упустил, после цикла 1 строка остается нетронутой... Что там поправить нужно, подскажите?Raven2009
Sub qq() Dim i& With Worksheets("$Аномалии").ListObjects(1).ListColumns("Тип аномалии") For i = .Range.Row + .ListRows.Count To .Range.Row Step -1 If Worksheets("$Аномалии").Cells(i, .Column) = "Недостача" Then Worksheets("$Аномалии").Cells(i, .Column).Delete Next End With End Sub
[/vba]
[vba]
Код
Sub qq() Dim i& With Worksheets("$Аномалии").ListObjects(1).ListColumns("Тип аномалии") For i = .Range.Row + .ListRows.Count To .Range.Row Step -1 If Worksheets("$Аномалии").Cells(i, .Column) = "Недостача" Then Worksheets("$Аномалии").Cells(i, .Column).Delete Next End With End Sub
Зря я занялся улучшайзингом. В 2х экземплярах [vba]
Код
Sub qq() Dim i& With Worksheets("$Аномалии").ListObjects(1) For i = .Range.Row + .ListRows.Count To .Range.Row Step -1 If Worksheets("$Аномалии").Cells(i, .ListColumns("Тип аномалии").Range.Column) = "Недостача" Then Worksheets("$Аномалии").Cells(i, .ListColumns("Тип аномалии").Range.Column).Delete Next End With End Sub Sub ww() Dim i& With Worksheets("$Аномалии").ListObjects(1) i = .Range.Row + .ListRows.Count Do While i > .Range.Row If Worksheets("$Аномалии").Cells(i, .ListColumns("Тип аномалии").Range.Column) = "Недостача" Then Worksheets("$Аномалии").Cells(i, .ListColumns("Тип аномалии").Range.Column).Delete i = i - 1 DoEvents ' для возможности прерывания кода в случае ошибки Loop End With End Sub
[/vba]
Цикл на удаление строк всегда идет снизу вверх, иначе неизбежны (или преодолимы весьма сложными плясками с бубном) ошибки.
.ListColumns("Тип аномалии").Range.Column можно заменить на 6
Зря я занялся улучшайзингом. В 2х экземплярах [vba]
Код
Sub qq() Dim i& With Worksheets("$Аномалии").ListObjects(1) For i = .Range.Row + .ListRows.Count To .Range.Row Step -1 If Worksheets("$Аномалии").Cells(i, .ListColumns("Тип аномалии").Range.Column) = "Недостача" Then Worksheets("$Аномалии").Cells(i, .ListColumns("Тип аномалии").Range.Column).Delete Next End With End Sub Sub ww() Dim i& With Worksheets("$Аномалии").ListObjects(1) i = .Range.Row + .ListRows.Count Do While i > .Range.Row If Worksheets("$Аномалии").Cells(i, .ListColumns("Тип аномалии").Range.Column) = "Недостача" Then Worksheets("$Аномалии").Cells(i, .ListColumns("Тип аномалии").Range.Column).Delete i = i - 1 DoEvents ' для возможности прерывания кода в случае ошибки Loop End With End Sub
[/vba]
Цикл на удаление строк всегда идет снизу вверх, иначе неизбежны (или преодолимы весьма сложными плясками с бубном) ошибки.
.ListColumns("Тип аномалии").Range.Column можно заменить на 6 RAN
Кстати выдает ошибку на вашем коде в строке, где For... Объект не поддерживает метод или что-то вроде этого...
Там нужно строку [vba]
Код
If Worksheets("$Аномалии").Cells(i, .ListColumns("Тип аномалии").Range.Column) = "Недостача" Then Worksheets("$Аномалии").Cells(i, .ListColumns("Тип аномалии").Range.Column).Delete
[/vba] уместить либо в одну строку, либо [vba]
Код
If Worksheets("$Аномалии").Cells(i, .ListColumns("Тип аномалии").Range.Column) = "Недостача" Then Worksheets("$Аномалии").Cells(i, .ListColumns("Тип аномалии").Range.Column).Delete End If
[/vba]
Цитата
Кстати выдает ошибку на вашем коде в строке, где For... Объект не поддерживает метод или что-то вроде этого...
Там нужно строку [vba]
Код
If Worksheets("$Аномалии").Cells(i, .ListColumns("Тип аномалии").Range.Column) = "Недостача" Then Worksheets("$Аномалии").Cells(i, .ListColumns("Тип аномалии").Range.Column).Delete
[/vba] уместить либо в одну строку, либо [vba]
Код
If Worksheets("$Аномалии").Cells(i, .ListColumns("Тип аномалии").Range.Column) = "Недостача" Then Worksheets("$Аномалии").Cells(i, .ListColumns("Тип аномалии").Range.Column).Delete End If
Ошибка возникает на строке, которая начинается с For i...
Насчет if я понимаю))
Может получится все-таки посмотреть вариант с Do Until... Loop? Мне интересно понять, что я не так написал там? 1 строка остается не удаленной...Raven2009
Raven2009, боротся с недосдачей лучше всего отфильтровав, удалить :-) [vba]
Код
With Sheets("$Аномалии").ListObjects("tAnomaly").Range .AutoFilter Field:=6, Criteria1:= _ "Недостача" .Offset(1).Resize(.Rows.Count - 1).EntireRow.Delete Shift:=xlUp .AutoFilter Field:=6 End With
[/vba]
Raven2009, боротся с недосдачей лучше всего отфильтровав, удалить :-) [vba]
Код
With Sheets("$Аномалии").ListObjects("tAnomaly").Range .AutoFilter Field:=6, Criteria1:= _ "Недостача" .Offset(1).Resize(.Rows.Count - 1).EntireRow.Delete Shift:=xlUp .AutoFilter Field:=6 End With
Ну слепой я, и считать плохо умею. А самостоятельно посчитать, что столбец Е пятый, а не шестой не судьба? Или вообще оставить как было с определением номера столбца по названию? А то в одном месте сменили, в другом нет.
[p.s.]Поглядел старый файл. Оказывается это не я плохо считать умею, это у кого-то ручки шаловливые.[/p.s.]
Ну слепой я, и считать плохо умею. А самостоятельно посчитать, что столбец Е пятый, а не шестой не судьба? Или вообще оставить как было с определением номера столбца по названию? А то в одном месте сменили, в другом нет.
[p.s.]Поглядел старый файл. Оказывается это не я плохо считать умею, это у кого-то ручки шаловливые.[/p.s.]RAN
Быть или не быть, вот в чем загвоздка!
Сообщение отредактировал RAN - Понедельник, 16.12.2019, 10:59
Sub ttt() Dim tt_&, i_& With Sheets("$Аномалии") tt_ = .Cells(Rows.Count, 1).End(xlUp).Row For i_ = tt_ To 2 Step -1 If .Cells(i_, 5).Value = "Недостача" Then .Rows(i_).Delete End If
Next i_ End With End Sub
[/vba]
моя попыточка
[vba]
Код
Sub ttt() Dim tt_&, i_& With Sheets("$Аномалии") tt_ = .Cells(Rows.Count, 1).End(xlUp).Row For i_ = tt_ To 2 Step -1 If .Cells(i_, 5).Value = "Недостача" Then .Rows(i_).Delete End If