Вы уверены, что он возвращает пустой диапазон?Когда я пытаюсь запустить это, VBA вызывает ошибку в вашей строке 'Set'.Если вы вызываете подпрограмму как UDF из рабочего листа, вы не увидите ошибку VBA, но UDF должен прекратить выполнение и вернуть #VALUE!.
В любом случае вы можете делай что хочешь, но есть одна большая оговорка.Во-первых, код:
Function ValidCells(rCells As Range) As Range
Dim valid As Range
Dim c As Range
For Each c In rCells
If c.Style <> "Bad" Then
If valid Is Nothing Then
Set valid = c
Else
Set valid = Union(valid, c)
End If
End If
Next
Set ValidCells = valid
End Function
Идея состоит в том, чтобы создать многообластный диапазон, используя метод VBA 'Union'.Так, например, если я поставлю плохую ячейку в C8 и вызову ValidCells (B7: D9), это вернет мультиобластной диапазон $ B $ 7: $ D $ 7, $ D $ 8, $ B $ 8: $ B $ 9,$ C $ 9: $ D $ 9.Затем вы можете использовать результат с суммой просто отлично.
Предостережение заключается в том, что изменение стилей ячеек не приведет к перерасчету этого UDF.Как правило, вы можете добавить такую строку:
Call Application.Volatile(True)
в вашу пользовательскую функцию, и она будет вызываться при каждом изменении рабочей книги.Однако, похоже, что изменение стиля ячейки не может рассматриваться как «изменение» в целях волатильности.Таким образом, вы можете получить то, что вы хотите, из UDF, но, похоже, нет никакого реального способа заставить его работать как «нормальный» в отношении пересчета, даже если вы пометите его как изменчивый.Вы должны знать об этом, если будете его использовать.