Excel подсчет по цвету VBA не обновляется с изменениями? - PullRequest
2 голосов
/ 29 мая 2019

У меня есть какой-то VBA в Excel, который подсчитывает, содержит ли диапазон ячеек цвет из эталонной ячейки, что хорошо работает.Но изменение цвета любой ячейки в диапазоне не обновляет подсчитанный итог.

В идеале я хочу, чтобы код обновлял количество цветных ячеек, соответствующих эталону, и, когда цвета ячеек меняются, дообновить подсчитанную сумму.

Я попытался добавить оператор Else в оператор If, чтобы, если ячейка была «пустой» или ее цвет был «очищен» с помощью кнопки заливки для заполнения ячеек, она вычиталачисло, но это не сработало.

Sub Colourif()
End Sub

Function CountColorIf(rSample As Range, rArea As Range) As Long
    Dim rAreaCell As Range
    Dim lMatchColor As Long
    Dim lCounter As Long

    lMatchColor = rSample.Interior.Color

    For Each rAreaCell In rArea
        If rAreaCell.Interior.Color = lMatchColor Then
            lCounter = lCounter + 1
        End If
    Next rAreaCell

    CountColorIf = lCounter
End Function

Если я изменю ячейку в заполнении диапазона с помощью значка рисования, чтобы сказать «очистить», это не изменит количество ячеек, заполненных эталонным цветом.

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

1 Ответ

1 голос
/ 29 мая 2019

К сожалению, не похоже, что изменение формата вызывает какой-либо из стандартных обработчиков событий Excel.Что-то, что приближается, будет предназначаться для события Изменения Выбора Рабочего листа.В модуле кода для рабочего листа поместите:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Me.Calculate
End Sub

Затем измените определение CountColorIf так, чтобы оно начиналось:

Function CountColorIf(rSample As Range, rArea As Range) As Long
    Application.Volatile 

Затем, если цвет ячейки изменилсясчет обновляется - как только вы переходите в другую ячейку.

Другая идея - использовать Application.OnTime для запуска подпрограммы, которая запускает пересчет каждые несколько секунд, но это все равно не приведетмгновенные обновления, как только вы измените цвет.

При редактировании Поскольку нет события FormatChange, на которое вы можете ориентироваться, использование SelectionChange в качестве прокси-сервера для него не идеально,Одна из проблем, которую вы отметили в комментариях, заключается в том, что это сработает в середине действия копирования-вставки, и в этом случае в результате вычисления рабочей таблицы Excel выйдет из режима копирования-вставки.Одним из решений этой конкретной проблемы является изменение кода на:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Application.CutCopyMode = 0 Then Me.Calculate
End Sub

Если этот код предназначен для вашего личного использования, простое решение - сохранить Application.Volatile, но полностью избавиться от обработчика событий,В привычку попадать F9, когда вы меняете цвет клетки.Это ограничит перерасчеты, когда вы их захотите, за счет необходимых действий с вашей стороны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...