Как подсчитать количество ячеек, которые НЕ отформатированы условным форматированием с использованием Excel VBA? - PullRequest
2 голосов
/ 01 августа 2011

Я действительно новичок в Excel VBA, и мне нужна помощь с этим.

У меня есть диапазон (A2: A22) на листе («Числа»), который был условно отформатирован (30%) для заливки фона цветом (ThemeColor = xlThemeColorDark1).

В моем столбце есть ячейки, которые соответствуют условию формата и имеют цвет заливки фона. Остальные не заполнены.

В макросе, который я пытаюсь построить, я хочу подсчитать количество ячеек в диапазоне, которые НЕ были отформатированы с заливкой.

Я отобразил счет в ячейке B2, но он возвращает 0.

Dim numberRange As Range, r As Long, count As Integer
Set numberRange = Worksheets("Numbers").Range("A2:A22")

count = 0    
For r = 1 To numberRange.Rows.Count
    If Not numberRange(r, 1).FormatConditions(1).Interior.ThemeColor = _
        xlThemeColorDark1 Then count = count + 1
Next r

Worksheets("Numbers").Range("B2").Value = count

Я просматривал форумы повсюду, и, возможно, я не вижу очевидного. Пожалуйста помоги. Спасибо!

1 Ответ

3 голосов
/ 01 августа 2011

Я потратил на это много времени и сумел создать функцию, которая будет сообщать вам, сколько ячеек в диапазоне, которые ДЕЛАЮТ или НЕ СОХРАНЯЮТ условия условного форматирования. Это работает только для числового условного форматирования (не «содержит текст»).

  • Введите TRUE, чтобы подсчитать все ячейки, которые соответствуют формуле условного форматирования ( по умолчанию )
  • Введите FALSE для подсчета всех ячеек, которые НЕ насытить формулу

Так что в вашем случае вы бы сделали:

=FormatCount(A2:A22, FALSE)

Вот функция!

Function FormatCount(ByVal myRange As Range, _
                     Optional ByVal check_result = True) As Long

Application.ScreenUpdating = False
Dim cell As Range
Dim count As Long
Dim result As Boolean
Dim formula1 As Long
Dim formula2 As Long

For Each cell In myRange
    On Error Resume Next
    With cell.FormatConditions
    If .count = 1 Then
        formula1 = CLng(Right(.Item(1).formula1, Len(.Item(1).formula1) - 1))
        formula2 = CLng(Right(.Item(1).formula2, Len(.Item(1).formula2) - 1))
        Select Case .Item(1).Operator
            Case 1
                If cell.Value >= formula1 And _
                    cell.Value <= formula2 Then
                    result = True
                End If
            Case 2
                If cell.Value < formula1 And _
                    cell.Value > formula2 Then
                    result = True
                End If
            Case 3
                If cell.Value = formula1 Then
                    result = True
                End If
            Case 4
                If cell.Value <> formula1 Then
                    result = True
                End If
            Case 5
                If cell.Value > formula1 Then
                    result = True
                End If
            Case 6
                If cell.Value < formula1 Then
                    result = True
                End If
            Case 7
                If cell.Value >= formula1 Then
                    result = True
                End If
            Case 8
                If cell.Value <= formula1 Then
                    result = True
                End If
        End Select
    End If
    End With

    If result = check_result Then
        count = count + 1
    End If
    result = False
Next

FormatCount = count
Application.ScreenUpdating = True

End Function

Как это работает:

  • Сначала я проверяю, есть ли 1 условный формат или нет (вы можете настроить это, чтобы проверить все условия, используя цикл for и .count, если вы очень хочу).
  • Способ условного форматирования сохраняется в Excel с оператором а затем формула. оператор сохраняется по номеру (например, 5 для>) и формула всегда начинается с "=", хотя это не является частью формула. Так что вам нужно убрать символ "=" из .formula1 и разыграть его долго.
  • Затем я проверяю оператор условия и затем использую регистр выбора. чтобы проверить форум. Я тогда просто вести подсчет, сколько клеток хит (или не хит).
...