3

Я прочитал существующие вопросы, но никакой ответ, казалось, не помог. У меня есть функция, которую я написал в VB, которая оценивает сумму ячеек в определенном диапазоне по цвету шрифта, все это хорошо работает, когда я набираю функцию (оценка верна).

Но когда я меняю цвет одной ячейки (ячейки, находящейся в диапазоне функции), значение суммы вообще не меняется. Он изменяется только (в этой определенной ячейке), когда я снова вхожу в функцию (мне не нужно полностью стирать, я просто должен снова нажать клавишу ввода, когда отмечаю функцию).

В чем может быть проблема? Все настройки кажутся нормальными, и я попытался открыть новый лист, но проблема настаивает.

Замечания:

Ctrl + Alt + F9 работает, но Application.Volatile нет (хотя я в Excel 2013).

Вот мой код в любом случае (хотя он работает):

Public Function SumByColor(rng As Range, clr As String) As Double
Application.Volatile

Dim s As Double
s = 0
Dim r As Range
Dim c As Long
If clr = "red" Then
    c = RGB(256, 0, 0)
End If
If clr = "black" Then
    c = RGB(0, 0, 0)
End If

For Each r In rng
    If r.Font.Color = c Then
        s = s + r.Value
    End If
Next r

SumByColor = s
End Function

1 ответ1

0

Application.Volatile недостаточно ......... функция рассчитывает каждый раз, когда вычисляется рабочая таблица, и этого может не произойти, если вы просто измените цвет.

EDIT # 1:

Сначала мы вносим в UDF() одну строчку, чтобы он принял необязательный вариантный аргумент, который он не использует !:

Public Function SumByColor(rng As Range, clr As String, Optional v As Variant) As Double
   Application.Volatile
   Dim s As Double
   s = 0
   Dim r As Range
   Dim c As Long

   If clr = "red" Then
       c = RGB(256, 0, 0)
   End If
   If clr = "black" Then
       c = RGB(0, 0, 0)
   End If

   For Each r In rng
       If r.Font.Color = c Then
           s = s + r.Value
       End If
   Next r

   SumByColor = s
End Function

а затем в листе используйте что-то вроде:

=SumByColor(A1:A14,"red",NOW())

Идея состоит в том, что если вы коснетесь F9, NOW() будет пересчитан, как и UDF() .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .