Удаление строки по условию

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Teslenko_EA
Сообщения: 526
Зарегистрирован: 04 фев 2007, 18:37
Откуда: Сургут
Контактная информация:

Здравствуйте kuznetsovSergey.
&quot писал(а):....Где оптимизация, не для конкретно заачи, а и другие варианты. Данный код медленный, и не универсальный... что за диапозон 65000 ???? зачем образабывать все строки, а если у меня будет всего 1000 строк, зачем я буду лишних 64000 строк проверять??? Производительность на первом месте. Количество заполненных строк надо сначала считать, а уж потом с ними работать.
Не стоит так высказываться, это выдает абсолютное незнание предмета
Рекомендую - Мартин Грубер Понимание SQL.rar 1.28 Мб, это поможет получить представление, о чем Вы пытались рассуждать.

Попытка хамства "..этот код пообще безграмотный.." тоже никак Вас не красит.
Уверяю Хорошый тон в общении не менее важен чем Хорошый тон в программировании.
Жаль, но у Вас пока недостает ни того ни другого. :(
Удачи Вам.
Евгений.
Вложения
Book1.zip
(23.9 КБ) 34 скачивания
kuznetsovSergey
Сообщения: 163
Зарегистрирован: 05 мар 2009, 11:27

Teslenko_EA писал(а):Здравствуйте kuznetsovSergey.
Не стоит так высказываться, это выдает абсолютное незнание предмета
Рекомендую - Мартин Грубер Понимание SQL.rar 1.28 Мб, это поможет получить представление, о чем Вы пытались рассуждать.

Попытка хамства "..этот код пообще безграмотный.." тоже никак Вас не красит.
Уверяю Хорошый тон в общении не менее важен чем Хорошый тон в программировании.
Жаль, но у Вас пока недостает ни того ни другого. :(
Удачи Вам.
Евгений.

Если Teslenko_EA , считаете что проверять 65000 строк это актуально, к сожалению это не так. Давайте рассмотри вариант если этот макрос будет написал в Excel 2007, где если мне не изменяет память около 2.500.000 строк, из которых он будет образабывать только 65.000 . Нужны решения проблемы универсальные, а не под конкретный случай, что бы другому пользователю этого форума, который захочет найти решению данной задачи, не возникло последующих вопросов.

Я просил подсказать как можно удалить строку в Excel по условию при помощи макроса, на что не смог получить подсказки в течении недели. Если вы считаете то что вы тут написали, это помогло моему вопросу,это тоже врят ли вас украсило. Делать замечания во всех темах подряд. это хороший метод поднятия статистики написанных сообщений, но это больше приравнивается к флуду.

В данной теме, я хочу узнать как решить данную проблему. Пожалуйста в предь оградите меня от данных замечаний.

Вопрос остаётся актуальным, до сих пор не выявлено как это осуществить.
--------------------------------------------------------------------------------
Добавленное сообщение
--------------------------------------------------------------------------------

Код: Выделить всё

Sub macros()
Dim i As Long
 a = "OSA"
    b = "aaa"
    c = "bbb"
    d = "ccc"
    e = "ddd"
    f = "eee"
    g = "ggg"
    h = "hhh"
While Sheets("page_name").Cells(i, 1) <> ""
case1 = Sheets("page_name").Cells(i, 15).Value
case2 = Sheets("page_name").Cells(i, 12).Value
Select Case Sheets("page_name").Cells(i, 12).Value
      Case b, e, f, d, g
            If case1 = d Then
                   Sheets("page_name").Rows(i).Delete
            ElseIf Left$(case1, len_b) = b Then
                   Sheets("page_name").Rows(i).Delete
            End If
            If case2 <> e And case2 <> f And case2 <> g Then
            Sheets("page_name").Rows(i).Delete
            End If
      Case Else
            Sheets("page_name").Rows(i).Delete
End Select
Wend
End Sub

кто нибудь подскажет в чем дело? всё равно выдает ошибку
Аватара пользователя
mc-black
Сообщения: 250
Зарегистрирован: 08 май 2008, 16:09
Откуда: Россия, Нижний Новгород
Контактная информация:

Не стоит хамить, так Вы никогда не получите ответов на Ваши вопросы. Вам дали первоклассные ответы, которые 100% работают и решают вопрос: Teslenko_EA(#4) и Aent (#5) на тот случай если #4 почему-то не нравится (мне понравился!). То что Вы тут перед всеми гнете свои детские пальчонки, Вас вовсе не красит. Вам взялись помогать два профессионала, а вы развели срач! Можете заводить себе другой ник, т.к. на этот больше вряд ли последует помощь. Пока.
На заказ: VBA, Excel mc-black@yandex.ru
kuznetsovSergey
Сообщения: 163
Зарегистрирован: 05 мар 2009, 11:27

mc-black писал(а):Не стоит хамить, так Вы никогда не получите ответов на Ваши вопросы. Вам дали первоклассные ответы, которые 100% работают и решают вопрос: Teslenko_EA(#4) и Aent (#5) на тот случай если #4 почему-то не нравится (мне понравился!). То что Вы тут перед всеми гнете свои детские пальчонки, Вас вовсе не красит. Вам взялись помогать два профессионала, а вы развели срач! Можете заводить себе другой ник, т.к. на этот больше вряд ли последует помощь. Пока.

браво !! аплодирую стоя !!
настолько исчерпывающий ответ, показывая ваш уровень знаний и воспитание. Особенно понравилось про детские пальченки, где то раньше слышали, или сами придумали? Мне остаётся только вами восхищаться !!
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Очень надеюсь, что публичный обмен любезностями на этом будет закончен.
Если в этом есть необходимость, можете продолжить ваши баталии в личных сообщениях. Но ниже данного сообщения в этой теме я буду все цензурировать.

kuznetsovSergey, раз не хотите использовать SQL для решения Вашей задачи, то так и скажите: "Хочу без SQL". Cоветы Aent Вам не помогли?
Если ошибка 400 по прежнему имеет место быть, то укажите, пожалуйста, что это за ошибка и на какой строке возникает. Попробует решить.
kuznetsovSergey
Сообщения: 163
Зарегистрирован: 05 мар 2009, 11:27

Могу сказать больше, Aent мне помог тут больше всех, но к сожалению макрос не работает, я пробовал различные способы, Aent предложил самый логичный.

в последнем варианте , с оператором case пишет
Run-time error '1004': Application-defined or object-defined error

ошибка возникает на строке, создания цикла while, на этой строке вылетает макрос.
Сам While начинает работать, а как только доходит до строки задания :
case1 = Sheets("page_name").Cells(i, 15).Value
сразу сворачивает макрос
Аватара пользователя
Naeel Maqsudov
Сообщения: 2570
Зарегистрирован: 20 фев 2004, 19:17
Откуда: Moscow, Russia
Контактная информация:

Понятно. Ошибка возникает в строке
While Sheets("page_name").Cells(i, 1) <> ""
В методе
Cells
Так как переменная i еще не присвоена. i=1 нужно до цикла.
Кстати, вместо сравнения с пустой строкой обычно предпочитают
While Not IsEmpty(Sheets("page_name").Cells(i, 1))
kuznetsovSergey
Сообщения: 163
Зарегистрирован: 05 мар 2009, 11:27

Код: Выделить всё

Sub macros()
Dim i As Long
 a = "XXX"
    b = "aaa"
    c = "bbb"
    d = "ccc"
    e = "ddd"
    f = "eee"
    g = "ggg"
    h = "hhh"
i = 1
While Not IsEmpty(Sheets("page_name").Cells(i, 1)) 
case1 = Sheets("page_name").Cells(i, 15).Value
case2 = Sheets("page_name").Cells(i, 12).Value
Select Case Sheets("page_name").Cells(i, 12).Value
      Case b, e, f, d, g
            If case1 = d Then
                   Sheets("page_name").Rows(i).Delete
            ElseIf Left$(case1, len_b) = b Then
                   Sheets("page_name").Rows(i).Delete
            End If
            If case2 <> e And case2 <> f And case2 <> g Then
            Sheets("page_name").Rows(i).Delete
            End If
      Case Else
            Sheets("page_name").Rows(i).Delete
End Select
i = i +1
Wend
End Sub
данный код, вылетает с ошибкой: Run-time error '9': Subscript out of range .

опять жа на месте, первой строки, в цикле while.
case1 = Sheets("page_name").Cells(i, 15).Value
Аватара пользователя
mc-black
Сообщения: 250
Зарегистрирован: 08 май 2008, 16:09
Откуда: Россия, Нижний Новгород
Контактная информация:

Во-первых, в приведенном коде нет приращения счетчика цикла. Следовательно, цикл не завершится, если не будет очищен весь список.
Во-вторых, как было указано ранее, за цикл не вынесено выражение Sheets("page_name") - это может ускорить перебор.
В-третьих, общий прием для ускорения пересчетов:

Код: Выделить всё

'В начале макроса:
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual

'В конце макроса
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
На заказ: VBA, Excel mc-black@yandex.ru
kuznetsovSergey
Сообщения: 163
Зарегистрирован: 05 мар 2009, 11:27

Код: Выделить всё

Sub macros()
Dim i As Long
 a = "OSA"
    b = "xxx"
    c = "aaa"
    d = "bbb"
    e = "ccc"
    f = "ddd"
    g = "eee"
    h = "fff"
i = 2
While Not IsEmpty(Sheets("name_page").Cells(i, 1))
case1 = Sheets("name_page").Cells(i, 15).Value
case2 = Sheets("name_page").Cells(i, 12).Value
Select Case case1
      Case b, d
            If case1 = d Then
                   Sheets("name_page").Rows(i).Delete
            End If
            If case1 = b Then
            Sheets("name_page").Rows(i).Delete
            End If
            If Left$(case1, len_b) = b Then
                   Sheets("name_page").Rows(i).Delete
            End If
 
      Case Else
            Sheets("name_page").Rows(i).Delete
End Select
  Select Case case2
      Case e, f, g
            If case2 <> e And case2 <> f And case2 <> g Then
                   Sheets("name_page").Rows(i).Delete
            End If
      Case Else
            Sheets("name_page").Rows(i).Delete
  End Select
i = i + 1
Wend
End Sub

но макрос работает следующим образом: заходить в первый селект, и доходя до строки
Case b, d
прыгает сразу на
Case Else
и приступает работать со вторым селектом. Второй селект точно так же


нашёл решение данной проблемы, для тех кому интересно как оно было найдено:

Код: Выделить всё

Sub macros()
Dim i As Long
 a = "aaa"
    b = "bbb"
    c = "ccc"
    d = "ddd"
    e = "eee"
    f = "fff"
    g = "ggg"
    h = "hhh"
i = 2
While Not IsEmpty(Sheets("name_page").Cells(i, 1))
sheet15 = Sheets("name_page").Cells(i, 15).Value
sheet12 = Sheets("name_page").Cells(i, 12).Value
If sheet15 = d Then
Sheets("name_page").Rows(i).Delete
i = i - 1
End If
If (Left(sheet15, Len(b)) = b) Then
Sheets("name_page").Rows(i).Delete
i = i - 1
End If
If sheet12 <> e And sheet12 <> f And sheet12 <> g Then
Sheets("name_page").Rows(i).Delete
i = i - 1
End If
i = i + 1
Wend
End Sub
довольно быстро работает, проганяет всё через один цикл, удаляя сразу строки за один прогон. Не стал использовать case потому что он начал ругаться с ним.
Ответить