Как да изтрия ред при определени условия?

Microsoft Excel Електронни таблици Microsoft 365 Excel VBA Програмиране VBA за Excel

Здравейте, имам следният казус Таблица с динамичен брой на редовете /средно по 4000/ и 31 колони . Опитвам се да напиша процедура, която да открива нулеви стойности в две конкретни клетки и като ги намери да изтрие реда. Това което направих работи, но много бавно.

Public Sub DeLL_nula()

Dim i As Integer Dim row_last As Long

row_last = Range("C2").CurrentRegion.Rows.Count For i = 2 To row_last If Cells(i, 10) = 0 And Cells(i, 17) = 0 Then

Range(Cells(i, 1), Cells(i, 31)).Delete i = i - 1

End If Next i

End Sub

Имали друг вариант? Благодаря предварително

Sub DelZero() Dim i As Long Dim tOld

tOld = Now DoEvents i = 2

Do If Cells(i, 5) = 0 Then Rows(i).Delete Shift:=xlUp Else i = i + 1 End If Loop While Cells(i, 1) <> "" MsgBox ("Времето за изтриване е :" & Format(Now - tOld, "ss:ms")) End Sub

Това е което аз нещото което мога аз да ти предложа. Като трябва да се има предвид, че i показва началото на таблицата ти с данни. За да работи коректно функцията е необходимо на първата колона задължително да пише нещо. При мен тази функция се изпълнява за 1s и 120ms при над 15 000 реда.

Това е таблицата

Това е времето за изпълнение

Благодаря ти Румен, Свърши работа с малко нагласяне към моите данни. Аз си открих и грешката, просто зацикля накрая. Но твоето решение е много по-добро.

Здравейте, когато се изтриват редове е по-добре изтриването да става от последния към първия ред на таблицата. Например, имате 200 реда в таблицата, в които имате 100 реда, които трябва да се изтрият. Започвате от първия ред, изтривате реда. Определили сте цикъла да се изпълнява 200 пъти, а след изтриването в таблицата вече има 199 реда, т.е. цикъла ще се изпълнява и за вече празни редове, което е причина за бавното изпълнение - 4000 реда! Решението е (използвам кода на Ева):

Public Sub DeLL_nula()

Dim i As Integer Dim row_last As Long

row_last = Range("C2").CurrentRegion.Rows.Count

For i = row_last To 2 Step -1

If Cells(i, 10) = 0 And Cells(i, 17) = 0 Then Range(Cells(i, 1), Cells(i, 31)).Delete

End If

Next i

End Sub

Надявам се, че успях да помогна.

Благодаря Ви за отговора, както и за прекрасния курс. Наистина сега процедурата работи много бързо.

браво


Вашият отговор

Научи компютърните програми онлайн от топ експертите на България
Регистрацията в АУЛА ви дава:
  • 20 безплатни урока
  • Трикове и тънкости за софтуера
  • Отговори на вашите въпроси
  • Регистрация