在 Excel VBA 中复制 "Applies to" 范围的条件格式
Copy Conditional Formatting with "Applies to" range in Excel VBA
场景:我有一个现有的工作簿,其条件格式 (CF) 应用于所有 sheet。 CF 应用于几列(减去 header 行),例如,"Applies to:" 范围设置为 =$A$2:$I$1048576。工作簿已填满大约 30 sheet 秒的数据。
问题:我需要更新工作簿中的所有 CF。为此,我将第一个 sheet 上的 CF 更新为新的 CF。然后我写了一个简单的 VBA 宏来将更新后的 CF 应用于所有其他 sheet,而不是 sheet-by-sheet 更新每个 sheet 上的所有 CF。我的代码运行良好,但有一个例外。它不会复制条件格式的 "Applies to:" 字段。
我只是复制第一行数据的格式,因为每个 sheet 的数据行数不同。在每个 sheet 的最后一行数据下方是 CF 键(向用户显示 CF 生成的行颜色的含义)。
我已经彻底搜索过了,找不到解决这个问题的方法。
下面是我的代码。我该如何解决这个问题?
Sub CondFormatting()
'
' CondFormatting Macro
'
Dim WS_Count As Integer
Dim i As Integer
WS_Count = ActiveWorkbook.Worksheets.Count
Sheets(1).Range("A2:I2").Copy
For i = 2 To WS_Count
Sheets(i).Cells.FormatConditions.Delete
Sheets(i).Range("A2:I2").PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Next i
Application.CutCopyMode = False
End Sub
谢谢。
** 更新 **
感谢下面 Jeffery 的回复,我能够解决我遇到的条件格式范围问题。对于那些有类似问题的人,下面是我修改后的代码,它将格式从一个 Table 复制并应用到整个工作簿中的另一个。
Sub CondFormatting()
'
' CondFormatting Macro
'
Dim WS_Count As Integer
Dim i As Integer
WS_Count = ActiveWorkbook.Worksheets.Count
Sheets(1).Range("A2").ListObject.DataBodyRange.Copy
For i = 2 To WS_Count
Sheets(i).Cells.FormatConditions.Delete
Sheets(i).Range("A2").ListObject.DataBodyRange.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Next i
Application.CutCopyMode = False
End Sub
此致。
'Applies To' 范围由 selection 在您创建(或在您的情况下复制)CF 规则时激活。因此,如果您希望 'Applies To' 引用范围 =$A$2:$I$1048576,那么在应用条件格式之前,您需要 select 每个 sheet 中的整个范围。
也就是说,将 CF 应用于整个列对我来说似乎有点过分了。最好将每个 sheet 上的每个数据区域更改为 Excel Table(又名 ListObject),因为它们会随着您的数据增长和缩小,应用的任何条件格式也会如此。
场景:我有一个现有的工作簿,其条件格式 (CF) 应用于所有 sheet。 CF 应用于几列(减去 header 行),例如,"Applies to:" 范围设置为 =$A$2:$I$1048576。工作簿已填满大约 30 sheet 秒的数据。
问题:我需要更新工作簿中的所有 CF。为此,我将第一个 sheet 上的 CF 更新为新的 CF。然后我写了一个简单的 VBA 宏来将更新后的 CF 应用于所有其他 sheet,而不是 sheet-by-sheet 更新每个 sheet 上的所有 CF。我的代码运行良好,但有一个例外。它不会复制条件格式的 "Applies to:" 字段。
我只是复制第一行数据的格式,因为每个 sheet 的数据行数不同。在每个 sheet 的最后一行数据下方是 CF 键(向用户显示 CF 生成的行颜色的含义)。
我已经彻底搜索过了,找不到解决这个问题的方法。
下面是我的代码。我该如何解决这个问题?
Sub CondFormatting()
'
' CondFormatting Macro
'
Dim WS_Count As Integer
Dim i As Integer
WS_Count = ActiveWorkbook.Worksheets.Count
Sheets(1).Range("A2:I2").Copy
For i = 2 To WS_Count
Sheets(i).Cells.FormatConditions.Delete
Sheets(i).Range("A2:I2").PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Next i
Application.CutCopyMode = False
End Sub
谢谢。
** 更新 **
感谢下面 Jeffery 的回复,我能够解决我遇到的条件格式范围问题。对于那些有类似问题的人,下面是我修改后的代码,它将格式从一个 Table 复制并应用到整个工作簿中的另一个。
Sub CondFormatting()
'
' CondFormatting Macro
'
Dim WS_Count As Integer
Dim i As Integer
WS_Count = ActiveWorkbook.Worksheets.Count
Sheets(1).Range("A2").ListObject.DataBodyRange.Copy
For i = 2 To WS_Count
Sheets(i).Cells.FormatConditions.Delete
Sheets(i).Range("A2").ListObject.DataBodyRange.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Next i
Application.CutCopyMode = False
End Sub
此致。
'Applies To' 范围由 selection 在您创建(或在您的情况下复制)CF 规则时激活。因此,如果您希望 'Applies To' 引用范围 =$A$2:$I$1048576,那么在应用条件格式之前,您需要 select 每个 sheet 中的整个范围。
也就是说,将 CF 应用于整个列对我来说似乎有点过分了。最好将每个 sheet 上的每个数据区域更改为 Excel Table(又名 ListObject),因为它们会随着您的数据增长和缩小,应用的任何条件格式也会如此。