Блок-оператори за повторение (loops): For ... Next

Безплатни 20 урока
регистрирай се и научи

Ако сте вече потребител - Регистриран съм
Видео

Тест за преминаване към следващия урок

 
За параметричен блок-оператор за повторение се задава стойност (параметър), която показва колко пъти да се повтори цикъла
Вярно
Не вярно
 
Блок-оператор For не може да завърши преди да достигне зададената стойност с оператор To
Не вярно
Вярно
 
Стойността на променливата-брояч се увеличава или намалява с оператор:
Step
не може да се променя, винаги е 1

Въпроси и отговори

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

    Ева Славова:

    Здравейте, имам следният казус Таблица с динамичен брой на редовете /средно по 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

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

    Ева Славова:

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

    Красен:

    браво