Страницы: 1
RSS
удалить строку целиком (VBA)
 
всем доброго времени суток
извините, что вас беспокоил
у меня такая проблема
есть таблица и в 9-й колонке сущест. даты
больше 100 тыс. строк
проблема такая: надо удалить строку целиком, если дата меньше 20.11.2013 г. и поднимать на вверх
написал следующий код, но неработает, прошу вашей подсказки
Код
Private Sub Test()    
    Application.ScreenUpdating = False
    Dim rw As Date
        For rw = 100 To 1 Step -1
        If Cells(rw, 9) < "20.11.2013" Then Rows(rw).Delete 'номер 9 - 9-й столбец
    Next
    Application.ScreenUpdating = True  
End Sub
спасибо за потраченное драгоценное время
Изменено: hk1209 - 30.01.2014 20:05:32
 
Чтож Вы с строкой сравниваете дату? Или там тоже строка, а не дата?
Приводите обе стороны к одному формату, в данном случае к дате, а вернее справа может быть переменная типа дата с нужной датой.
 
в 9 колонке дата
 
 А сравниваете вы ее с ТЕКСТОМ "20.11.2013"... В экселе, как и во-многих других средах программирования в кавычках подразумевает текстовый формат.
Если автоматизировать бардак, то получится автоматизированный бардак.
 
Попробуйте так
Код
If Cells(rw, 9) < CDate("20.11.2013") Then Rows(rw).Delete 'номер 9 - 9-й столбец

 
Согласие есть продукт при полном непротивлении сторон
 
То что там дата - это ещё не факт. Видали мы всяких дат... Пока не докажете - не поверю :)
 
Sanja спасибо за подсказку
в таблице примерно 100 тыс строк
использую следующий код:
Код
Private Sub Test()    
    Application.ScreenUpdating = False
    Dim rw As Date
      For rw = 100000 To 1 Step -1
      If Cells(rw, 9) < CDate("20.11.2013" Then Rows(rw).Delete
    Next
    Application.ScreenUpdating = True 
End Sub
долго выполняется
есть ли у вас какие-то идеи для оптимизации данного кода?
каждый раз кол-во строк разные бывает больше или меньше 100 тыс строк
что надо дописать, чтобы проверка прошла до последней заполненной ячейки определенного столбца?
спасибо за потраченное драгоценное время
 
Для ускорения выполнения кода отключите автоматический пересчет:
Код
 Application.Calculation = xlCalculationManual
в конце процедуры включить:
Код
Application.Calculation = xlCalculationAutomatic
так определяется последняя ячейка номер последней строки с данными в 9-м столбце:
Код
Cells(Rows.Count, 9).End(xlUp).Row
Изменено: Sanja - 30.01.2014 12:45:13
Согласие есть продукт при полном непротивлении сторон
 
4. Обрабатывать массивы, а не ячейки - на листе только удалять строки, да и тут можно это делать один раз сразу с группой.
5. Как я уже сказал - использовать переменную, а не 100000 раз делать CDate("20.11.2013"  ;)  .
6. Зачем непременно удалять строки? Может просто переложить данные, затереть ненужное?

P.S.Упустил - Dim rw As Date - это ошибка!
Изменено: Hugo - 30.01.2014 12:57:32
 
Sanja & Hugo спасибо за подсказку и потраченное драгоценное время
Hugo переписал код по вашим замечаниям, к сожалению не работает
Код
Private Sub Test()
    Dim rw As Long, FirstRow As Long, LastRow As Long
        Application.Calculation = xlCalculationManual
        Application.ScreenUpdating = False
    For rw = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1 To FirstRow Step -1
        If Cells(Rows.Count, 9).End(xlUp).Row < CDate("20.11.2013" Then Rows(rw).ClearContents
    Next
        Application.ScreenUpdating = True
        Application.Calculation = xlCalculationAutomatic
End Sub
Знаю что там не правильно, но не могу понять где именно
прошу вашей помощи
спасибо за понимание
Изменено: hk1209 - 30.01.2014 20:06:26
 
Cells(Rows.Count, 9).End(xlUp).Row < CDate("20.11.2013")
вдумайтесь что и с чем сравниваете.
FirstRow - значение 0. Как минимум под конец ошибку получите.

Hugo совсем иное советовал..
До начала цикла:
Код
dim dDt as Date
dDt =  CDate("20.11.2013")
И уже в цикле:
Код
If Cells(rw, 9) <  dDt  Then Rows(rw).Delete

С массивами чуть сложнее в понимании, но на Вашем примере было бы так:

Код
Private Sub Test()
 Application.ScreenUpdating = False
 Dim rw As Long, dDt As Date, avItems, lLastR As Long
 lLastR = Cells(Rows.Count, 9).End(xlUp).Row
 If lLastR <= 1 Then Exit Sub
 dDt = CDate("20.11.2013")
 avItems = Range(Cells(1, 9), Cells(lLastR, 9)).Value
 For rw = lLastR To 1 Step -1
 If avItems(rw, 1) < dDt Then Rows(rw).Delete
 Next
 Application.ScreenUpdating = True
End Sub


P.S. И оформляйте коды тегами. Значок "<...>" среди кнопок вверху при создании сообщения.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Супербыстрое удаление строк от ZVI есть тут:

http://www.sql.ru/forum/actualthread.aspx?tid=722758

Можно использовать и в этой задаче.
Вернее так - в тот код встроить эту проверку даты  :)
 
The_Prist спасибо за потраченное драгоценное время и советы (включая код)
Hugo - спасибо за ссылку
теперь все понятно
еще раз спасибо всем и хорошего рабочего дня и вечера
Страницы: 1
Читают тему
Наверх