【问题标题】:Type Mismatch vba overdue date highlighter类型不匹配 vba 过期日期荧光笔
【发布时间】:2017-06-29 22:20:51
【问题描述】:

在 VBA 方面仍然不是很好......

Sub CompareDates()

Dim dueDate As Date, sht As Worksheet, i As Long

For Each sht In ThisWorkbook.Sheets

For i = 1 To CountMyRows(sht.Name)
    dueDate = CDate(sht.Range("E" & i))
    If dueDate > Date Then
        sht.Range("E" & i).Interior.ColorIndex = 5
    End If
Next i

Next sht

End Sub

得到类型不匹配:

dueDate = CDate(sht.Range("E" & i))

我不知道为什么这不起作用我有其他人测试它并且它适用于他们的。

编辑:我已经摆脱了错误但代码不起作用并突出显示所有过期任务...

【问题讨论】:

  • sht.Range("E" & i)的值是多少
  • 我感觉特定单元格有一个公式错误,例如 #DIV/0!#NA 或类似的东西
  • @SiddharthRout 嘿!它应该是第 5 列,因为我希望宏在每张纸上搜索 E 列中的每一列
  • 我知道你正在遍历 col 5,但是当你得到错误时,调试它并查看 sht.Range("E" & i) 的值是什么
  • 当我将鼠标悬停在它上面时会显示 c_date= "due date"

标签: vba excel


【解决方案1】:

您可以在使用CDate 之前使用IsDate 来防止错误。 CDate 仅在您传入一个可以实际转换为日期的值时才有效。

您可以将代码更改为:

Option Explicit

Sub CompareDates()

    Dim dueDate As Date, sht As Worksheet, i As Long

    For Each sht In ThisWorkbook.Sheets

        For i = 1 To CountMyRows(sht.Name)
            If IsDate(sht.Range("E" & i).Value) Then '<-- check if value is a date
                dueDate = CDate(sht.Range("E" & i))
                If dueDate > Date Then
                    sht.Range("E" & i).Interior.ColorIndex = 5
                End If
            End If
        Next i

    Next sht

End Sub

示例 - 请注意,它不适用于 2017 年 7 月 13 日:

【讨论】:

  • Hiya @RobinMackenzie 谢谢你,但它仍然没有突出显示过期日期
【解决方案2】:

在'For'循环中每次都会失败吗?

dueDate = CDate(sht.Range("E" & i))

sht.Range("E" &amp; i)) 将返回例如文本时将失败。

尝试首先将sht.Range("E" &amp; i)) 分配给如下变量:

For i = 1 To 5

    c_date = sht.Range("E" & i)
    dueDate = CDate(c_date)
    If dueDate > Date Then
        sht.Range("E" & i).Interior.ColorIndex = 5
    End If
Next I

这样您就可以更好地跟踪进度 - 也许您的基础数据对于此类比较无效(这不是日期)

【讨论】:

  • 嘿!它仍然说类型不匹配。对于到期日期= CDate(c_date) @SławomirMytych