我不是一个VBA代码编写人员,但我试图涉足以下内容:
目标:当单元格B3 =完成时,使工作表标签颜色变为绿色,或者当单元格B3 =打开时,使其变为黄色。
单元格B3有一个公式:=IF(SUM(B6:B8)=0,"Complete","Open")。
我试着使用下面的代码(从搜索中找到的),并修改了一些我需要的。留下"Case Else"节只是为了避免过多地混淆代码,并且认为无论如何都只会满足前两个条件。
它可以工作,但只有当你手动输入"Complete"或";Open"作为单元格B3中的值。我想保留公式,但是代码看到的是公式而不是公式的值。经过大量的阅读和尝试理解VBA,也许我需要Worksheet_Calculate()某处?
Private Sub Worksheet_Change(ByVal Target As Range)
'Updateby Extendoffice
If Target.Address = "$B$3" Then
Select Case Target.Value`your text`
Case "Open"
Me.Tab.Color = vbYellow
Case "Complete"
Me.Tab.Color = vbGreen
Case Else
Me.Tab.Color = vbBlue
End Select
End If
End Sub
你可以这样做:
Private Sub Worksheet_Calculate()
With Me.Range("B3").DisplayFormat
If .Interior.ColorIndex = xlNone Then
Me.Tab.ColorIndex = xlColorIndexNone
Else
Me.Tab.Color = .Interior.Color
End If
End With
End Sub
选项卡的颜色将跟随单元格的填充颜色(如果没有cf应用的填充,则清除)
据我所知,你不能这么做。
当包含公式的单元格更新时,Worksheet_Calculate事件被触发,但是没有办法检查该事件是由您感兴趣的单元格触发的还是完全由其他东西触发的。
你可以做的是,首先看看是什么导致单元格更新,并检查它。
@TimWilliams的评论可能暗示你可以这样做:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim checkRange As Range
Set checkRange = Range("B6:B8")
If Not Application.Intersect(checkRange, Target) Is Nothing Then
If range("B3").Value = "Complete" Then
Me.Tab.Color = vbGreen
Else
Me.Tab.Color = vbYellow
End If
End If
End Sub
但这只会在手动更改B6-B8范围内的单元格时起作用。
你也可以这样写:
Private Sub Worksheet_Change(ByVal Target As Range)
If Range("B3").Value = "Complete" Then
Me.Tab.Color = vbGreen
Else
Me.Tab.Color = vbYellow
End If
End Sub
这将在每次工作表上的任何更改时更新标签颜色,而不仅仅是B3或B6:B8。