Как я могу написать UDF в Excel VBA для фильтрации диапазона ячеек? - PullRequest
1 голос
/ 05 марта 2011

У меня появилась привычка отмечать внешние данные, меняя стили ячеек.Я хотел бы написать UDF в Excel, чтобы взять Range ячеек в качестве входных данных и вернуть подмножество этого диапазона, который не помечен как выброс.

Это то, что я пробовал:

Function ValidCells(rCells As Range) As Range
    Dim c As Range
    For Each c In rCells
        If c.Style <> "Bad" Then
            Set ValidCells = Range(c, ValidCells)
        End If
    Next
End Function

Мое намерение состоит в том, чтобы иметь возможность сделать =Sum(ValidCells(A1:D1)), и сделать так, чтобы он суммировал только нестилированные данные.

Однако ValidCells, похоже, каждый раз возвращает пустой диапазон,Что я делаю не так?

1 Ответ

1 голос
/ 05 марта 2011

Вы уверены, что он возвращает пустой диапазон?Когда я пытаюсь запустить это, 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, но, похоже, нет никакого реального способа заставить его работать как «нормальный» в отношении пересчета, даже если вы пометите его как изменчивый.Вы должны знать об этом, если будете его использовать.

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