处理 ListObject 中的多个列以进行条件格式化

问题描述 投票:0回答:1

我正在使用一个表(Excel 365),其中包含 50 列和大约 7000 行(不断增加)。该表的格式为 ListObject。到目前为止一切顺利。
现在我需要处理 8 列(不是彼此相邻且同时)的地址,以便为它们分配 4 种不同的条件格式。程序

Set condition = rng.FormatConditions.Add(xlExpression, Formula1:="=.....")

显然不可能从 ListObject 创建另一个数组(消息:类型不兼容)。至少我现在还没有找到办法。我也试过了

With rng 
    .FormatConditions.Add

.....但 VBA 总是要求“=”。

有人有什么想法吗?有可能吗? 感谢您的帮助!

excel vba conditional-formatting listobject
1个回答
0
投票

您的任务是在应用格式条件之前将

rng
设置为正确的范围。可以使用
ListColumns
访问表格的列。这是表中所有列的集合。因此,您可以通过索引或通过列名称来寻址单个列(列的名称由标题单元格定义)。

列的范围可以通过属性

Range
访问。但是,这包括标题行,通常您不想将格式应用于标题。相反,您可以使用属性
DataBodyRange
,这会省略标题单元格。

要获取所有感兴趣列的所有单元格,只需使用

Union
命令即可。

所以你的代码可能如下所示:

Dim table As ListObject
Set table = ActiveSheet.ListObjects(1)  ' Change to your needs
Dim rng As Range

' Define the list of columns you want to use.     
Dim colList, i As Long
colList = Array(2, 3, 5)                     ' Either by index...
colList = Array("Name", "Street", "Info") ' ... or by name

' Loop over the columns and build the Range
For i = LBound(colList) To UBound(colList)
    Dim col As ListColumn
    Set col = table.ListColumns(colList(i))
    If rng Is Nothing Then
        Set rng = col.DataBodyRange
    Else
        Set rng = Union(rng, col.DataBodyRange)
    End If
Next

' Optional: Remove existing FormatConditions  
Do While table.DataBodyRange.FormatConditions.Count > 0
    table.DataBodyRange.FormatConditions(1).Delete
Loop

' Now set new FormatConditions for the Range
Dim fc As FormatCondition
Set fc = rng.FormatConditions.Add(xlExpression, Formula1:="=" & rng.Cells(1).Address(False, False) & ">5")
fc.Interior.Color = vbYellow

请注意,一旦您将条件格式应用于表格列,当您添加新行时,它就会“增长” - 换句话说,新行将自动具有相同的格式。

© www.soinside.com 2019 - 2024. All rights reserved.