使用VBA突出显示包含公式的空白单元格

时间:2018-09-08 14:13:17

标签: excel vba conditional-formatting

范围"C2:E" & lastrow"G2:G" & lastrow"Q2:R" & lastrow包含一个动态分配到所有单元格的公式:"=IFNA(VLOOKUP($B2,CONTACTS,2/3/4/8/10/11,FALSE),"")",其中列C返回第2列中的值在CONTACTS表中,D列为第三列中的值,E列为第四列中的值,依此类推。

现在,如果它不包含任何内容/空白,则需要使用VBA在RED中突出显示此范围内的所有单元格,这意味着vlookup在CONTACTS表中找不到任何内容。数据是动态的,因此没有确定的行数,并且我不想格式化未包含在数据中的单元格。

我该怎么做? TIA!

3 个答案:

答案 0 :(得分:1)

不太理想,但以下方法应该起作用。根据需要更改工作表名称。理论上,如果所有单元格都有一个公式,则可以删除IsEmpty部分。

Dim rng As Range

For Each rng In ThisWorkbook.Worksheets("Sheet1").Range("C2:E" & lastRow)
    If IsEmpty(rng) Or rng = vbNullString Then rng.Interior.Color = vbRed
Next

您还可以将SpecialCells与公式一起使用,以仅对具有公式的单元格进行处理(测试是否首先出现公式,或者在未找到公式的情况下进行错误处理):

Dim rng As Range

For Each rng In ThisWorkbook.Worksheets("Sheet1").Range("C2:E" & lastRow).SpecialCells(xlCellTypeFormulas)
    If rng = vbNullString Then rng.Interior.Color = vbRed
Next

您可以使用union组合不同的范围:

Dim rng As Range
With ThisWorkbook.Worksheets("Sheet1")
    For Each rng In Union(.Range("C2:E" & lastRow), .Range("G2:G" & lastRow), .Range("Q2:R" & lastRow)).SpecialCells(xlCellTypeFormulas)
        If rng = vbNullString Then rng.Interior.Color = vbRed
    Next
End With

答案 1 :(得分:1)

条件格式可以使此任务更容易。这是在VBA中应用CFR的方法。

with thisworkbook.worksheets("sheet4").range("C:E, G:G, Q:R")
    .FormatConditions.Delete
    with .FormatConditions.Add(Type:=xlExpression, Formula1:="=and(iserror(--C1), C1=text(,))")
        .Interior.Color = vbred
    end with
end with

with thisworkbook.worksheets("sheet4").range("C:E, G:G, Q:R")
    .FormatConditions.Delete
    with .FormatConditions.Add(Type:=xlExpression, Formula1:="=and(istext(C1), C1=text(,))")
        .Interior.Color = vbred
    end with
end with

with thisworkbook.worksheets("sheet4").range("C:E, G:G, Q:R")
    .FormatConditions.Delete
    with .FormatConditions.Add(Type:=xlExpression, Formula1:="=and(isformula(C1), C1=text(,))")
        .Interior.Color = vbred
    end with
end with

答案 2 :(得分:0)

您可以避免条件格式设置和循环操作

With Intersect(Range("C:E, G:G, Q:R"), Rows("1:" & lastrow))
     .Interior.Color = vbRed ' first color all cells
    .SpecialCells(xlCellTypeFormulas, xlNumbers).Interior.Pattern = xlNone ' then un-color those with a numeric output 
End With