我解决此问题的方法只是将条件格式全部丢弃并添加Worksheet_Change() 事件。相应地检查条件和格式。
请注意,这是一种非常艰巨的方法,但它完成了工作。如果条件格式的构建包含一种将格式作为可能条件包含在内的方法,那就容易多了。
作为旁注,由于工作表是通过代码添加的,因此它们本身不包含此代码,但它位于名为 clsEvents 的 ClassModule 中。
ClassModule中的声明
Public WithEvents chngSht As Worksheet
Module 中的声明,其中 sub 是添加工作表的地方
Dim arrShts() as New clsEvents
当一个工作表被添加,或者工作簿被打开时,这个子被调用
Sub shtEvents()
Dim sht As Worksheet
Erase arrShts
ReDim arrShts(0)
For Each sht In ThisWorkbook.Worksheets
If Not sht.Name = "Menu" And Not sht.Name = "Tabellen" Then
If UBound(arrShts) = 0 Then
ReDim arrShts(1 To 1)
Else
ReDim Preserve arrShts(1 To UBound(arrShts) + 1)
End If
Set arrShts(UBound(arrShts)).chngSht = sht
End If
Next
End Sub
执行条件格式化的实际代码。
Private Sub chngSht_Change(ByVal Target As Range)
Dim sht As Worksheet
Dim x As Long, y As Long
Dim arrRange(1 To 4) As Range
Dim blnWeekend As Boolean
Set sht = Target.Parent
With sht
.Unprotect
x = 1
For y = 1 To 13 Step 4
Set arrRange(x) = .Range(.Cells(4, y).Offset(0, 2), .Cells(.Rows.Count, y).End(xlUp).Offset(0, 2)) 'Gather the 4 quarters of the year in 4 seperate ranges in an array.
x = x + 1
Next
For x = 1 To 4 'Iterate through the quarters of the year
If Not Intersect(Target, arrRange(x)) Is Nothing Then 'Check if the event changed is in Q1, Q2, Q3 or Q4, or not
blnWeekend = fnblnWeekend(Target.Offset(0, -2)) 'Check if the date falls in a weekend
With .Range(Target, Target.Offset(0, -2)).Interior
Select Case True
Case Target = Empty And Target.Offset(0, -1) = Empty And Not blnWeekend 'Event removed, no national holiday or other special day, and date is not a weekend
.Color = RGB(255, 255, 255)
.PatternColor = xlAutomatic
.Pattern = xlNone
Case Target = Empty And Target.Offset(0, -1) = Empty And blnWeekend 'Event removed, no national holiday or other special day, and date is in a weekend
.Color = RGB(255, 255, 204)
.PatternColor = xlAutomatic
.Pattern = xlSolid
Case Target = Empty And Not Target.Offset(0, -1) = Empty And Not blnWeekend 'Event removed, possibly national holiday or other special day, and dat is not in a weekend
Select Case True
Case Target.Offset(0, -1).Interior.Color = RGB(91, 155, 213) 'Color of changed date indicates a National Holiday
.Color = RGB(91, 155, 213)
.PatternColor = xlAutomatic
.Pattern = xlSolid
Case Target.Offset(0, -1).Interior.Color = RGB(198, 239, 206) 'Color of changed date does not indicate a National Holiday
.Color = RGB(255, 255, 255)
.PatternColor = xlAutomatic
.Pattern = xlNone
End Select
Case Target = Empty And Not Target.Offset(0, -1) = Empty And blnWeekend 'Event removed, possibly a national holiday or other special day, and the date is in a weekend
Select Case True
Case Target.Offset(0, -1).Interior.Color = RGB(91, 155, 213) 'Color of changed date indicates a National Holiday
.Color = RGB(91, 155, 213)
.PatternColor = xlAutomatic
.Pattern = xlSolid
Case Target.Offset(0, -1).Interior.Color = RGB(255, 255, 204) 'Color of changed date does not indicate a National Holiday
.Color = RGB(255, 255, 204)
.PatternColor = xlAutomatic
.Pattern = xlSolid
End Select
Case Not Target = Empty And Target.Offset(0, -1) = Empty And Not blnWeekend 'Event added, no National Holiday or other special day, and date is not a weekend
.Color = RGB(198, 239, 206)
.PatternColor = xlAutomatic
.Pattern = xlSolid
Case Not Target = Empty And Target.Offset(0, -1) = Empty And blnWeekend 'Event added, no National Holiday or other special day, and date is in a weekend
.Color = RGB(255, 255, 204)
.PatternColor = RGB(198, 239, 206)
.Pattern = xlUp
Case Not Target = Empty And Not Target.Offset(0, -1) = Empty And Not blnWeekend 'Event added, possibly National Holiday or other special day, and the date is not in a weekend
Select Case True
Case Target.Offset(0, -1).Interior.Color = RGB(91, 155, 213) 'Color of changed date indicates a National Holiday
.Color = RGB(91, 155, 213)
.PatternColor = RGB(198, 239, 206)
.Pattern = xlUp
Case Target.Offset(0, -1).Interior.Color = RGB(255, 255, 255) 'Color of changed date does not indicate a National Holiday
.Color = RGB(198, 239, 206)
.PatternColor = xlAutomatic
.Pattern = xlSolid
End Select
Case Not Target = Empty And Not Target.Offset(0, -1) = Empty And blnWeekend 'Event added, possibly National Holiday or otheer special day, and date is not a weekend
Select Case True
Case Target.Offset(0, -1).Interior.Color = RGB(91, 155, 213) 'Color of changed date indicates a National Holiday
.Color = RGB(91, 155, 213)
.PatternColor = RGB(198, 239, 206)
.Pattern = xlUp
Case Target.Offset(0, -1).Interior.Color = RGB(255, 255, 204) 'Color of changed date does not indicate a National Holiday
.Color = RGB(255, 255, 204)
.PatternColor = RGB(198, 239, 206)
.Pattern = xlUp
End Select
End Select
End With
Exit For
End If
Next
.Protect
End With
End Sub