【问题标题】:How to AutoUpdate as each day passes a conditional format based on date?当每天通过基于日期的条件格式时如何自动更新?
【发布时间】:2013-03-26 21:22:29
【问题描述】:

我是编写 VBA 代码的新手,但在过去的几周里一直在努力。

我为工作表更改事件创建了一个代码,它突出显示特定窗口中输入的某些日期,如下所示:

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 "": icolor = 2 
        Case Is <= Date + 30: icolor = 3 
        Case Is <= Date + 60: icolor = 6 
        Case Is > Date + 60: icolor = 2 
        End Select 
        If icolor <> 0 Then cell.Interior.ColorIndex = icolor 
    Next cell 
End Sub 

它完美无缺。但是,我需要电子表格基本上每天更新突出显示。 IE:如果 Date + 61 今天没有突出显示,它将在明天突出显示,因为它适合作为 Date + 60 的窗口。我怀疑一个简单的“工作表更改事件”不能做到这一点(因为它需要用户输入)。

我已尝试将其调整为工作表激活代码,以便在打开文档时可能更新突出显示(我试图避免打开工作簿,因为我将有多个工作表做不同的事情),但我无法获得它工作。关于我做错了什么的任何想法?还是有更好的方法来完成我想做的事情?

提前谢谢。

Private Sub Worksheet_Activate()
    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 "": icolor = 2    
            Case Is <= Date + 30: icolor = 3
            Case Is <= Date + 60: icolor = 6
            Case Is > Date + 60: icolor = 2            
        End Select
        If icolor <> 0 Then cell.Interior.ColorIndex = icolor
    Next cell
End Sub

【问题讨论】:

    标签: vba excel highlighting auto-update


    【解决方案1】:

    没有Target 参数传递给Worksheet_activate,所以你不能使用Intersect() 测试。你只需要直接循环你的范围

    For Each cell In Me.Range("C3:T65").Cells
        'check value
    Next cell 
    

    这里最好的方法是将 hiliting 逻辑拆分为一个单独的 Sub,然后从您的事件处理程序中调用它:

    编辑:添加 workbook_open

    'in ThisWorkbook module
    Private Sub Workbook_Open()
         Sheet1.CheckData Sheet1.Range("C3:T65")
    End Sub
    
    'in sheet code module
    Private Sub Worksheet_Activate()
        CheckData Me.Range("C3:T65")
    End Sub
    
    Private Sub Worksheet_Change(ByVal Target As Range)
        CheckData Intersect(Target, Me.Range("C3:T65"))
    End Sub
    
    Sub CheckData(rng As Range)
        Dim icolor As Integer
        Dim cell As Range
    
        If rng Is Nothing Then Exit Sub
    
        For Each cell In rng.Cells
            icolor = 0
            Select Case cell
                Case "": icolor = 2
                Case Is <= Date + 30: icolor = 3
                Case Is <= Date + 60: icolor = 6
                Case Is > Date + 60: icolor = 2
            End Select
            If icolor <> 0 Then cell.Interior.ColorIndex = icolor
        Next cell
    End Sub
    

    【讨论】:

    • 当 VBA 在工作表代码模块(或类的任何实例)中运行时,Me 指的是该模块所附加到的工作表。您不需要将其更改为(例如)Sheet1。实际上,将其保留为Me 会更加健壮:那么如果您更改工作表的代号,则什么都不会破坏...
    • 我已经更新了代码。有什么方法可以测试它是否正确更新而不必等到明天?我已强制(手动)不正确地突出显示日期,并且在打开/关闭时它们仍然错误地突出显示。我还强制更改了计算机上的系统日期,它也没有更改任何内容。
    • 只需将选中范围内所有单元格的颜色设置为“无”,然后在工作表之间切换即可。切换回来应该会触发宏并适当地为所有单元格着色。
    • 只是添加 - 如果工作表在工作簿打开时处于活动状态,则不会触发 worksheet_activate 事件:您需要在 ThisWorkbook 模块中放置一些代码来处理:使用Workbook_Open 事件。
    • 我试过无济于事:Private Sub Workbook_Open() Worksheets("Sheet1").Activate End Sub
    猜你喜欢
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    • 2022-07-29
    • 2021-12-22
    • 2021-10-04
    • 1970-01-01
    相关资源
    最近更新 更多