Как можно автоматически рассчитать лист при изменении цвета ячейки или через определенный интервал? - PullRequest
0 голосов
/ 21 марта 2019

Я следовал этому руководству: https://www.exceltrick.com/how_to/sum-cells-based-on-background-color/?

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

Так есть ли способ автоматически рассчитывать лист при изменении цвета ячейки или вычислять его через определенный интервал?

Редактировать:

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

Worksheet_Change Событие вызывается только тогда, когда любая ячейкапересчитывается.

Код:

Function SumByColor(CellColor As Range, rRange As Range)
Dim cSum As Long
Dim ColIndex As Integer
ColIndex = CellColor.Interior.ColorIndex
For Each cl In rRange
  If cl.Interior.ColorIndex = ColIndex Then
    cSum = WorksheetFunction.Sum(cl, cSum)
  End If
Next cl
SumByColor = cSum
End Function

Ответы [ 2 ]

0 голосов
/ 21 марта 2019

Есть два способа решить эту проблему.

Первый способ - просто автоматически пересчитать весь лист с интервалом: https://www.mrexcel.com/forum/excel-questions/505713-calculating-sheet-every-2-minutes.html

Второй способ - использовать Worksheet_SelectionChange, и если какой-либо из зависимостей предыдущего выбора использует функцию SumByColor, рассчитайте их. Вы также можете просто позвонить Application.CalculateFull, но это дорого и может раздражать, если вы перемещаетесь по таблице с помощью клавиш со стрелками.

Public PreviousActiveCell As Range
Public Locked As Boolean

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Locked Then
        Exit Sub
    End If
    If Not PreviousActiveCell Is Nothing Then
        'If PreviousActiveCell has no dependents this will raise an error.
        'There is no way to check if PreviousActiveCell has dependents without triggering the error.
        On Error GoTo SetPrevious
        'DirectDependents will call this function, avoid endless recursion
        Locked = True
        For Each dependent In PreviousActiveCell.DirectDependents
            If InStr(dependent.Formula, "SumByColor") Then
                dependent.Dirty
            End If
        Next dependent
    End If
SetPrevious:
    Locked = False
    Set PreviousActiveCell = Target
End Sub
0 голосов
/ 21 марта 2019

У меня есть похожая функция в одном из моих файлов, с которыми работал

 Application.Volatile 

Ниже вашего определения Dim.Замедляет файл, но если он не слишком большой, он делает свое дело.

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