всем доброго времени суток извините, что вас беспокоил у меня такая проблема есть таблица и в 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
Чтож Вы с строкой сравниваете дату? Или там тоже строка, а не дата? Приводите обе стороны к одному формату, в данном случае к дате, а вернее справа может быть переменная типа дата с нужной датой.
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 тыс строк что надо дописать, чтобы проверка прошла до последней заполненной ячейки определенного столбца? спасибо за потраченное драгоценное время
4. Обрабатывать массивы, а не ячейки - на листе только удалять строки, да и тут можно это делать один раз сразу с группой. 5. Как я уже сказал - использовать переменную, а не 100000 раз делать CDate("20.11.2013" . 6. Зачем непременно удалять строки? Может просто переложить данные, затереть ненужное?
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
Знаю что там не правильно, но не могу понять где именно прошу вашей помощи спасибо за понимание
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. И оформляйте коды тегами. Значок "<...>" среди кнопок вверху при создании сообщения.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
The_Prist спасибо за потраченное драгоценное время и советы (включая код) Hugo - спасибо за ссылку теперь все понятно еще раз спасибо всем и хорошего рабочего дня и вечера