Как подсчитать только видимые ячейки в пользовательской функции (подсчитать ячейки в зависимости от цвета ячейки) - PullRequest
0 голосов
/ 07 февраля 2020

Я использую пользовательскую функцию, найденную на net. Он делает то, что мне нужно - считает ячейки определенного цвета c в диапазоне ячеек.

Как мне отредактировать его, чтобы считать только видимые ячейки? Я пытался использовать это, но это ничего не делает.

For Each rCell In CountRange.SpecialCells(xlCellTypeVisible)

Полная функция такова:

    Function GetColorCount(CountRange As Range, CountColor As Range, Optional VolatileParameter As Variant)
Dim CountColorValue As Integer
Dim TotalCount As Integer
CountColorValue = CountColor.Interior.ColorIndex
Set rCell = CountRange
For Each rCell In CountRange
  If rCell.Interior.ColorIndex = CountColorValue Then
    TotalCount = TotalCount + 1
  End If
Next rCell
GetColorCount = TotalCount
End Function

Чтобы использовать ее в рабочем листе, я набираю:

=GetColorCount(A1:G20,H1, NOW())

Где:

  • A1: G20 - это диапазон, в котором я хочу сосчитать все желтые ячейки
  • H1 - это ячейка, в которой отображается счетчик, и окрашена в желтый цвет
  • NOW () заставляет работать каждый раз, когда изменение сделано в диапазоне (??)

Любые советы?

Ответы [ 2 ]

1 голос
/ 07 февраля 2020
Function GetColorCount(CountRange As Range, CountColor As Range, Optional VolatileParameter As Variant)
 Dim ColVal As Long, rCell As Range
 Dim TotalCount As Long
 ColVal = CountColor.Interior.ColorIndex
    For Each rCell In CountRange.Cells
      If rCell.Interior.ColorIndex = ColVal Then
          If rCell.EntireRow.Hidden = False And _
              rCell.EntireColumn.Hidden = False Then
              TotalCount = TotalCount + 1
          End If
      End If
    Next rCell
 GetColorCount = TotalCount
End Function

SpecialCells нельзя использовать в UDF, но возможна проверка каждой ячейки в видимости диапазона ...

1 голос
/ 07 февраля 2020

SpecialCells действительно непрочный, когда обернут в UDF, подобный этому.

Вот решение / обходной путь, проверяя высоту строки и ширину столбца на ноль. Я уверен, что другие существуют, но это один из способов достижения вашей цели.

Function GetColorCount(CountRange As Range, CountColor As Range, Optional VolatileParameter As Variant)
    Dim CountColorValue As Integer
    Dim TotalCount As Integer
    CountColorValue = CountColor.Interior.ColorIndex
    For Each rcell In CountRange.Cells
        If rcell.Interior.ColorIndex = CountColorValue Then
            If (rcell.EntireRow.Height * rcell.EntireColumn.Width) <> 0 Then
                TotalCount = TotalCount + 1
            End If
        End If
    Next rcell
    GetColorCount = TotalCount
End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...