Выделите пустые ячейки, содержащие формулы, используя VBA - PullRequest
0 голосов
/ 08 сентября 2018

Диапазон "C2:E" & lastrow, "G2:G" & lastrow и "Q2:R" & lastrow содержит формулу, которая динамически распределяется по всем ячейкам: "=IFNA(VLOOKUP($B2,CONTACTS,2/3/4/8/10/11,FALSE),"")", где столбец C возвращает значение во 2-м столбце таблицы CONTACTS, в столбце D - значение в 3-м столбце и в столбце E значение в 4-м столбце и т. д. и т. д.

Теперь мне нужно выделить все ячейки в этом диапазоне в КРАСНОМ, используя VBA, если он не содержит ничего / пусто, что означает, что vlookup не нашел ничего в таблице CONTACTS. Данные являются динамическими, поэтому нет определенного количества строк, и я не хочу форматировать ячейки, которые не включены в мои данные.

Как я это сделаю? ТИА!

Ответы [ 3 ]

0 голосов
/ 08 сентября 2018

Условное форматирование может облегчить эту задачу. Вот как применить CFR с VBA.

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
0 голосов
/ 09 сентября 2018

вы можете избежать как условного форматирования, так и циклов

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
0 голосов
/ 08 сентября 2018

Не идеально, но должно работать следующее.Измените имя листа, как требуется.Теоретически вы можете отбросить часть 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...