2015-09-29 4 views
2

Я пытаюсь удалить несколько строк в листе Excel на основе значения ячейки, которое является датой. Лист 1, D6 - дата.Удалить ошибку несоответствия строк

Sub SAVE() 
'----- DELETE OLD ROWS ----- 
Dim r As Range 
Dim x As Integer 
Dim Monday As String 
Dim Tuesday As String 
Dim Wednesday As String 
Dim Thursday As String 
Dim Friday As String 
Dim Saturday As String 
Dim Sunday As String 
Monday = Sheet1.Range("D6").Value 
Tuesday = Sheet1.Range("D6").Value + 1 
Wednesday = Sheet1.Range("D6").Value + 2 
Thursday = Sheet1.Range("D6").Value + 3 
Friday = Sheet1.Range("D6").Value + 4 
Saturday = Sheet1.Range("D6").Value + 5 
Sunday = Sheet1.Range("D6").Value + 6 

For x = 5000 To 2 Step -1 '---> Change as needed 

    Set r = Range("A" & Format(x)) 
    If UCase(r.Value) = Monday Then 
    Rows(x).EntireRow.Delete 
    End If 

    Set r = Range("A" & Format(x)) 
    If UCase(r.Value) = Tuesday Then 
    Rows(x).EntireRow.Delete 
    End If 

    Set r = Range("A" & Format(x)) 
    If UCase(r.Value) = Wednesday Then 
    Rows(x).EntireRow.Delete 
    End If 

    Set r = Range("A" & Format(x)) 
    If UCase(r.Value) = Thursday Then 
    Rows(x).EntireRow.Delete 
    End If 

    Set r = Range("A" & Format(x)) 
    If UCase(r.Value) = Friday Then 
    Rows(x).EntireRow.Delete 
    End If 

    Set r = Range("A" & Format(x)) 
    If UCase(r.Value) = Saturday Then 
    Rows(x).EntireRow.Delete 
    End If 

    Set r = Range("A" & Format(x)) 
    If UCase(r.Value) = Sunday Then 
    Rows(x).EntireRow.Delete 
    End If 

Next 
End Sub 

Этот код работает иногда. Каждый раз я получаю ошибку времени выполнения «13» типа «Несоответствие». Когда я нажимаю debug, он выделяет If UCase(r.Value) = Monday Then.

Ошибка: r.Value = Error 2023, Monday = "7/4/2016"

Изображение листа он тянет из:

enter image description here

Любые идеи, что здесь происходит?

+0

Только принимая дикий удар в темноте, так как мы не можем видеть данные, на которых вы запускаете код, возможно, что ошибка связана с функцией «UCase()», передавая, возможно, пустую ячейку или что-то в этом роде. Проверьте все ячейки и посмотрите, заметили ли вы какие-либо странные символы или аномалии. – AndrewB

+0

Когда вы нажимаете debug, каковы значения переменных 'r.Value' и' Monday'? – omegastripes

+1

Повторите ошибку. Когда вы находитесь в окне отладки, нажмите Ctrl + G, чтобы открыть панель окна «Немедленное окно». В этом окне введите '? r.Value' и сообщает нам результат. – Vegard

ответ

2

Я полагаю, что ниже код будет делать то, что вы собираетесь:

Sub SAVE() 
    ' Sheet1 is named "Control Panel", Sheet1 D6 has the pull date 
    ' Sheet5 is named "Database", has the stored dates to delete 
    '----- DELETE OLD ROWS ----- 
    Dim dtFrom As Date 
    Dim dtUpto As Date 
    Dim y As Long 
    Dim vCont As Variant 
    dtFrom = Sheets("Control Panel").Range("D6").Value 
    dtUpto = dtFrom + 6 
    With Sheets("Database") 
     For y = 5000 To 2 Step -1 
      vCont = .Cells(y, 1).Value 
      If Not IsError(vCont) Then 
       If vCont >= dtFrom And vCont <= dtUpto Then 
        .Rows(y).EntireRow.Delete 
       End If 
      End If 
     Next 
    End With 
End Sub 
+0

Было бы интересно узнать, быстрее ли ваш подход, чем мой. Я часто задаюсь вопросом о «невидимых» накладных расходах встроенных функций. – Vegard

+0

Очевидно, что это не так быстро, поскольку оно включает проверку ошибок и два сравнения, поэтому 3 ссылки на «Ячейки()» в целом. BTW для ссылки на мою ОС на «Ячейки»(). Значение «занимает около 8 мкс, а' DateDiff() 'вызывает около 2 мкс. – omegastripes

+0

Сравнение было бы несправедливым с проверкой ошибок, поэтому, естественно, это то, с чем я не рассчитывал бы. Но ваш отчет о 'Cells(). Value' и' DateDiff() 'интересен и, вероятно, достаточно хорошо отвечает на вопрос. – Vegard

0

резервную копию книги и попробовать этот рефакторинг (теперь модифицирована согласно предложению omegastripes'):

Sub SAVE() 
    '----- DELETE OLD ROWS ----- 
    Dim r As Range, x As Integer, y As Variant 

    y = Sheet1.Range("D6").Value + 3 

    For x = 5000 To 2 Step -1 
     Set r = Range("A" & x) 
     If DateDiff("d", y, r.Value) <= 3 Then Rows(x).EntireRow.Delete 
    Next x 
End Sub 
+0

Не считаете ли вы ссылкой на 'Sheet1.Range (« D6 »). Значение« около 5000 раз даст немного замедления? – omegastripes

+0

Возможно, теперь должно быть лучше. – Vegard

+0

Только что попробовал это ... отлично работает значительно медленнее. – hinteractive02

Смежные вопросы