2015-05-30 7 views
0

avid reader, первый раз здесь. У меня есть макрос, который я получил из Интернета по большей части, а затем внес некоторые коррективы. Цель состоит в том, чтобы окрасить кодовые ячейки, прошедшие определенную продолжительность. Раньше он работал нормально, но теперь я получаю сообщение об ошибке «Тип несоответствия». Строка, которая гласит: «Здесь ошибка», я получаю несоответствие. Я озадачен тем, что раньше он работал нормально. Я не опытный программист каким-либо образом, но я просто пытаюсь устранить проблемы. Я просмотрел всю сеть и не могу найти конкретного ответа на мой вопрос.Ошибка времени выполнения 13 - Несоответствие по дате

Кроме того, если кто-либо из вас желает, я был бы признателен за ваш совет о том, как сделать этот код ТОЛЬКО при запуске книги и НЕ периодически, поскольку он настроен для этого сейчас. Этот код не размещен на листе, но в модуле. Я упоминаю об этом, потому что я не уверен, сколько практической разницы он может оказать любую помощь, спасибо!

Public TimeToRun As Date 

Sub Auto_Open() 
Call ScheduleCompareTime 
    End Sub 

Sub ScheduleCompareTime() 
TimeToRun = Now + TimeValue("00:00:10") 
Application.OnTime TimeToRun, "CompareTimeStamp" 
    End Sub 

Sub CompareTimeStamp() 
Dim rgTimeStamp As Range 
Dim rdTimeStamp As Range 
Dim i As Long 
Dim j As Long 
Dim MyNow As Date 
Dim TimeStamp As Date, TimeStampp As Date 

Set rgTimeStamp = Range("c1:c500") 
Set rdTimeStamp = Range("H1:h500") 

For i = 1 To rgTimeStamp.Rows.Count 

    If Not rgTimeStamp.Cells(i, 1) < 1 Then 'don't run for an empty cell 

     MyNow = CDate(Now - TimeSerial(0, 0, 0)) 'time instantly 
     TimeStamp = CDate(rgTimeStamp.Cells(i, 1)) 'THIS IS WHERE THE ERROR IS!! 
     If TimeStamp < MyNow Then 'if it's old at all 
      rgTimeStamp.Cells(i, 1).Interior.ColorIndex = 3 'make fill colour red 
     End If 
    End If 

    Next 

For j = 1 To rdTimeStamp.Rows.Count 

    If Not rdTimeStamp.Cells(j, 1) < 1 Then 

     MyNow = CDate(Now - TimeSerial(0, 0, 0)) 
     TimeStampp = CDate(rdTimeStamp.Cells(j, 1)) 
     If TimeStampp < MyNow Then 
      rdTimeStamp.Cells(j, 1).Interior.ColorIndex = 3 
     End If 


    End If 'closes If Not 
Next 
Call ScheduleCompareTime 'begins the scheduler again 
End Sub 

Sub auto_close() 'turn the scheduler off so you can close workbook 
Application.OnTime TimeToRun, "CompareTimeStamp", , False 
End Sub 
+1

Там, вероятно, является несоответствие, например теперь в 'C1' есть заголовок, поэтому скажем, что' CDate («Временная метка») на самом деле должно давать ошибку. Могут быть и более тонкие шажки: с неверно отформатированной датой или одним пробелом в ячейке. Чтобы проверить это, взгляните на значение 'i', когда оно перестает отлаживаться. – user3819867

ответ

1

Возможно, у вас есть данные в одной или нескольких ячейках, которые Excel не может преобразовать в дату. Вы можете обойти эту проблему, добавив некоторые простые проверки, такие как это:

'.... beginning of your code 

If Not rgTimeStamp.Cells(i, 1) < 1 Then 'don't run for an empty cell 

    MyNow = CDate(Now - TimeSerial(0, 0, 0)) 'time instantly 

    If IsDate(rgTimeStamp.Cells(i, 1)) = False Then 
     MsgBox "Invalid date found in cell " & rgTimeStamp.Cells(i, 1).Address(False, False) 
     Exit Sub 
    End If 

    TimeStamp = CDate(rgTimeStamp.Cells(i, 1)) 'THIS IS WHERE THE ERROR IS!! 
    If TimeStamp < MyNow Then 'if it's old at all 
     rgTimeStamp.Cells(i, 1).Interior.ColorIndex = 3 'make fill colour red 
    End If 
End If 


'... rest of your code 

Если вы хотите только код для запуска при запуске затем изменить Sub Auto_Open к этому:

Sub Auto_Open() 
Call CompareTimeStamp 
End Sub 
+1

Также закомментируйте повторяющееся 'Call ScheduleCompareTime 'снова начинает планировщик'. – user3819867

+0

И если это не режет, я бы проверил 'IsNumeric (rgTimeStamp.Cells (i, 1) .Value2)'. Значение типа «Double» может быть преобразовано в дату, а не в одно. Сам по себе текст тоже может быть верным ... – user3819867

+0

О, спасибо, что открыли мне глаза! Я считаю, что ошибка, с которой я столкнулась, состояла в том, что я продолжал смешиваться с ячейками метки (очищая их, удаляя их), и поэтому они меняли ценности. Спасибо за головы! Я по-прежнему буду тестировать решения, которые вы предоставили, чтобы лучше понять различные способы устранения неполадок. Кто-нибудь из вас, случайно, знает, как ЗАМОРАЖАТЬ метку времени, чтобы она не корректировалась после каких-либо изменений в целевой ячейке? – TimberRaiders