Страницы: 1 2 След.
RSS
Удаление строк по условию, ошибка макроса
 
Здравствуйте, уважаемые господа.
Есть вопрос по корректности работы макроса. Не могу понять, почему он не работает. Если данный макрос:
Код
Sub macros1 ()
Dim cell As Range
For Each cell In [F5:F300].Cells
If cell = 1 Then
cell.EntireRow.Delete
End If
Next cell
End sub

выполнить на примере файла во вложении, то строка 32, которая в ячейке F32 имеет значение 1- не удалится. Если запустить макрос повторно, то эта строка удаляется. Вопрос в том, почему при первом проходе макрос не удаляет все строки с единичками?

Второй вопрос, как записать диапазон "от ячейки ф5 до последней ячейки"? Что-то типа
Код
For Each cell In [F5: End(xlDown)]
только грамотнее... С синтаксисом пока тяжеловато.

И третий вопрос, что храинт эксель в пустых ячейках? То есть если будет код
Код
If cell = 0 Then

будут ли удалены пустые ячейки?
 
удалять надо всегда с хвоста, по счетчику
от 99999 до 1
 
Странная особенность. Ну ок, учту.

Все равно не получается. Не могу понять, что не правильно. Подскажите пожалуйста.

Код
Dim r As Long, i As Long ' объявляю переменные
   r = ActiveSheet.UsedRange.Row - 1 + ActiveSheet.UsedRange.Rows.Count ' определяю номер последней строки
      For i = r To 6 Step -1 ' цикл от последней строки до строки под номером 6
         If Cells(i, 5) = 1 Then ' если ячейка (i, F) равняется 1
            ActiveSheet.Rows(i).Delete ' удалить строку(i)
         End If
      Next i


Почему оно не работает?
Изменено: Derian Fox - 28.03.2013 00:23:45
 
Должно работать, если последнюю строку определили правильно, и, если единички там, где ждёте. Смущает комментарий:
Цитата
If Cells(i, 5) = 1 Then ' если ячейка (i, F) равняется 1
Проверяете пятый столбец, а в комментарии говорите о шестом.
 
Спасибо за помощь. Переделал в

Код
Dim r As Long, i As Long ' объявляю переменные
   r = ActiveSheet.Cells(ActiveSheet.Rows.Count, "A").End(xlUp).Row - 1 ' определяю номер последней строки
      For i = r To 5 Step -1 ' цикл от последней строки до строки под номером 6
         If Cells(i, 6) = 1 Then ' если ячейка (i, F) равняется 1
            ActiveSheet.Rows(i).Delete ' удалить строку(i)
         End If
      Next i


И все замечательно работает  :)
То-то оно не работало...в 5-м столбце не было единичек...
 
И ничего странного - строки удаляются сразу, как только их удаляют (а как иначе?)
И подумайте, что сразу после этого происходит.
 
Да, в этом есть смысл. Если удалить 10-ю строку, то 11я станет десятой, а так как цикл будет идти по возростанию, то некоторые строки, которые идут подряд, не будут обрабатываться.
А на счет иначе, то есть вариант такой, что в цикле сохранять номера нужных строк в массив, а потом удалить все строки, перебирая сохраненный массив...Но это сложновато будет, как для меня)
 
Если данных (удаляемых строк) много, то хороший вариант примерно так и сделать:
1.создаём массив нужного размера, 1 столбец
2. анализ, пишем в массив метку у удаляемых строк
3. выгружаем массив на лист
4. фильтруем по меткам (или используем columndifferences), удаляем сразу все отобранные строки.

На форуме есть примеры кода, поищите например по "columndifferences"
 
Чтобы не разводить кучу тем, решил спросить в этой.

Есть две переменные: a и b типа long. Я определяю блок строк, где a - это верхняя строка, а b - нижняя. Теперь я хочу удалить этот блок, как это записать?

Rows("a : b").Delete - не работает. (это я типа по аналогии с Rows("10:20").Delete)
Изменено: Derian Fox - 29.03.2013 01:04:51
 
Rows(a & ":" & b) .Delete
 
Работает, спасибо  :)
Изменено: Derian Fox - 01.04.2013 01:26:46
 
и ещё вопрос, как записать найденные данные в масив? Есть цикл перебора ячеек, условие такое, если найдешь определенный текст, то записать номер строки в массив.
Вот есть код:
Код
For z = BaseCell To LastCell
   If Cells(z, 18) = "some text" Then     
      AnArray(0) = Rows(z)
   End If
Next z

Проблема в том, что в номер строки записывается в массив как первый элемент и если находит "some text" в другом месте, то первый елемент массива перезаписывается, а мне надо, чтобы записывало как второй элемент массива, потом третий, четвертый и так далее.
Изменено: Derian Fox - 30.03.2013 22:59:37
 
Цитата
Derian Fox пишет:
чтобы записывало как второй элемент массива,
нужно, чтобы массив был определен, как содержащий 2 элемента.
Для массивов - поглядите в справке ReDim Preserve.
 
Проще собирать номера в коллекцию. Или в словарь - тогда легче потом собранное выгрузить. Ну смотря по задаче конечно.
 
А как в колекцию собрать?
Мне надо собрать номера, чтобы потом сравнить найбольшее значение с заданым критерием.
 
Тогда зачем собирать? Сразу сравнивайте, или храните только наибольшее.
 
точно. Хорошая идея, спасибо за совет)
 
Всем доброго времени суток. Есть похожий вопрос - решил запостить в этой теме. Существуют три столбца с данными, во втором столбце встречается значение "0". Задача - удалить строки, содержащие ячейки с "0".  Пробовал 2мя способами.
вот этот код работает:
Скрытый текст

А этот нет (удаляется лишь первая строка, в ячейке которой найден 0):


Скрытый текст

Хотелось бы понять - в чем причина.

 
Hostyle, при удалении строк цикл следует организовать снизу вверх.
 
И всё? Причина только в этом? Спасибо, приму к сведению.
 
Hostyle, Вы тему вообще читали, или Вы только писатель? :)
 
В книге несколько листов. Задача:
Нужно удалить все нижние строки после строки "ВСЕГО" во всех листах включая строку где написан текст "ВСЕГО:"
На первом листе текст "ВСЕГО:" в ячейке A86
Код
Sub Primer()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
Application.DisplayStatusBar = False
Application.DisplayAlerts = False
Dim i As Long
For i = 10000 To 1 Step -1
    If Cells(i, 1) = "ВСЕГО:" Then
        'Range(Cells(i, 1), Cells(i, 2)).Select
        Cells(i, 1).EntireRow.Delete
    End If
Next i
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Application.DisplayStatusBar = True
Application.DisplayAlerts = True
End Sub

как доработать этот макрос? Он удаляют только 1 строку где текст "ВСЕГО:" и только в активном листе не во всех листах
Изменено: Aziz Amonov - 25.10.2021 12:06:42
 
И Вам здравствуйте!
Кому задача? Кому нужно?
 
Цитата
Юрий М написал:
Кому
Мне, по моей работе
 
Так Вы не помощи у форума просите, а ставите задачу. Да и поздороваться с форумчанами не помешало бы.
 
Цитата
Юрий М написал:
Так Вы не помощи у форума просите, а ставите задачу. Да и поздороваться с форумчанами не помешало бы.
Сорри простите новичка. Здравия желаю товарищи офицеры
Нужна помощь без Вас никак, изучаю VBA но пока не силен...
 
Aziz Amonov,
Код
Sub mrshkei()
Dim sh As Worksheet, cell As Range
    For Each sh In Worksheets
    Set cell = sh.Cells.Find("ВСЕГО:")
        If Not cell Is Nothing Then
            sh.Rows(cell.Row & ":" & sh.Range("A1").SpecialCells(xlLastCell).Row).Clear
        End If
    Next sh
End Sub

Изменено: Mershik - 25.10.2021 12:40:32
Не бойтесь совершенства. Вам его не достичь.
 
Код
Option Explicit

Sub mrshkei()
Dim sh As Worksheet, cell As Range
    For Each sh In Worksheets
    Set cell = sh.Cells.Find("ВСЕГО:")
        If Not cell Is Nothing Then
            sh.Rows(cell.Row & ":" & sh.Range("A1").SpecialCells(xlLastCell).Row).Clean
        End If
    Next sh
End Sub
Почему то код ругает
Изменено: Aziz Amonov - 25.10.2021 12:43:31
 
Aziz Amonov, clean на clear замените

удалите картинку из пред сообщения своего..
Изменено: Mershik - 25.10.2021 12:43:20
Не бойтесь совершенства. Вам его не достичь.
 
Попробуйте такой вариант:
Код
Sub DeleteRows()
Dim i As Long, Rng As Range, LastRow As Long
    For i = 1 To Sheets.Count
        With Sheets(i)
            LastRow = .Cells.Find(What:="*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
            Set Rng = .Cells.Find(What:="ВСЕГО*", LookIn:=xlValues, lookAt:=xlWhole, SearchDirection:=xlPrevious)
            If Not Rng Is Nothing Then
                Range(.Cells(Rng.Row + 1, 1), .Cells(LastRow, 1)).EntireRow.Delete
            End If
        End With
    Next
End Sub
Изменено: Юрий М - 25.10.2021 12:45:15
Страницы: 1 2 След.
Читают тему
Наверх