根据日期和其他条件突出显示单元格

Posted

技术标签:

【中文标题】根据日期和其他条件突出显示单元格【英文标题】:Highlight cells based on date and other conditions 【发布时间】:2013-03-18 05:23:48 【问题描述】:

我正在尝试在 VBA 中编写基于特定条件的突出显示功能。我可以通过条件格式轻松地做到这一点,但我注意到如果用户剪切/粘贴(除了特殊的)/删除行/等。然后修改条件格式范围。我希望条件格式范围保持固定,而不是映射到实际单元格。如果有人知道怎么做,或者保护条件格式但仍然允许数据操作,那么这段代码就没有必要了。

我找到了两个我一直在尝试的不同代码,但是由于我是 VBA 新手,所以我不太擅长它并遇到了问题。我不知道如何使用 Isblank 或 Isempty 功能。

我需要用红色突出显示早于 30 天的日期(包括过去的日期)。我需要用黄色突出显示早于 60 天但超过 30 天的日期。没有数据的单元格和超过 60 天的单元格必须保持不突出显示。

非常感谢任何帮助!

Private Sub Worksheet_Change(ByVal Target As Range)

Dim icolor As Integer

    If Not Intersect(Target, Range("C3:T65")) Is Nothing Then

        Select Case Target

            Case Is <= Date + 60

                icolor = 6

            Case Is <= Date + 30

                icolor = 3

            Case IsEmpty()

                icolor = 2

        End Select


        Target.Interior.ColorIndex = icolor

    End If

End Sub

其他选项:

Sub Highlight()
    Dim cell As Range

    For Each cell In Range("C3:T65")
        If cell.Value <= Date + 60 And cell.Value > Date + 30 Then
            cell.Offset(0, 1).Interior.ColorIndex = 6

        ElseIf cell.Value <= Date + 30 Then
            cell.Offset(0, 1).Interior.ColorIndex = 3

        ElseIf cell.Value IsEmpty() Then
            cell.Offset(0, 1).Interior.ColorIndex = 2

        End If
    Next cell

End Sub

【问题讨论】:

【参考方案1】:

您的两个代码都差不多了。以下两者的组合应该可以完成这项工作:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim icolor As Integer
    Dim cell As Range

    If Intersect(Target, Range("C3:T65")) Is Nothing Then Exit Sub

    For Each cell In Target
        icolor = 0
        Select Case cell
            Case Is <= Date + 30: icolor = 3
            Case Is <= Date + 60: icolor = 6
            Case "": icolor = 2
        End Select
        If icolor <> 0 Then cell.Interior.ColorIndex = icolor
    Next cell
End Sub

【讨论】:

我得到一个编译错误:“没有选择案例的案例”突出显示了“案例单元格”。我是否在某处插入“Do Select”? 我在“Case cell”之前插入了“Select”,它起作用了。但是,现在我遇到了一个问题:如果我选择一个单元格并点击“Backspace”,那么该单元格会变成黄色,尽管它是空的。此外,Case Is &lt;= Date + 60 覆盖了Case Is &lt;= Date + 30。关于如何使黄色包含从 > Date + 30 到 我想通了。我以相反的顺序重新排列了 Case 行并修复了它。非常感谢!! @user2214690:很抱歉缺少Select- 我编辑了代码并颠倒了顺序。谢谢你的评论!【参考方案2】:

使用 VBNullString 检查单元格是否为空:

ElseIf cell.Value = vbNullString Then

【讨论】:

这是我上面列出的第二个编码代替ElseIf cell.Value IsEmpty() Then吗? 确实如此。您快到了,但您在条件中使用了电子表格公式 我在上面操作了 Peter Albert 的代码,它运行良好。我刚刚尝试使用您的更改,脚本返回时没有错误,但无法正确突出显示。许多随机单元格以红色突出显示。我试图重新安排 ElseIf 和 If 代码,看看它是否会做任何事情,但它带来了新的突出显示问题。不过感谢您的帮助。 没问题。如果你以后需要检查空白单元格或字符串,至少你现在知道了!

以上是关于根据日期和其他条件突出显示单元格的主要内容,如果未能解决你的问题,请参考以下文章

如何编辑我的 HTML 代码以根据条件突出显示一行的所有单元格?

在相邻单元格中找到的日期之后的十个工作日(不包括节假日)突出显示相邻单元格

VBA 突出显示边界条件外范围内的单元格

UITableView:突出显示最后一个单元格,但其他单元格也会突出显示

以单击另一个单元格为条件突出显示单元格

有条件地格式化 Python 熊猫单元格