Как усреднить видимые / отфильтрованные ячейки в диапазоне, отвечающем критериям другого диапазона в функции VBA?

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

Пока у меня есть следующее:

Function AverVisibleIC(Rg As Range, BU As Range)

Dim xCell As Range
Dim xCount As Integer
Dim xTtl As Double
Dim c As Range
Set BU = Range("B13:B44")

Application.Volatile
Set Rg = Intersect(Rg.Parent.UsedRange, Rg)
For Each xCell In Rg
    If xCell.ColumnWidth > 0 _
      And xCell.RowHeight > 0 _
      And Not IsEmpty(xCell) _
      And IsNumeric(xCell.Value) Then
          xTtl = xTtl + xCell.Value
          xCount = xCount + 1
    End If
Next
    If xCount > 0 Then
        For Each c In BU
        If c.Value = "IC" Then
            AverVisibleIC = xTtl / xCount
             Else
                AverVisibleIC = 0
     End If
         End If
Next
End Function

Спасибо!

1 ответ

Решение

Сбросьте диапазон BU в соответствии с оставшимся размером Rg после пересечения его с использованным диапазоном.

Вы, кажется, знаете только, находится ли IC внутри BU один раз. Ваш первоначальный цикл мог перезаписать желаемый результат, продолжая искать IC после того, как IC была найдена.

Я не знаю, идеально ли это, но, возможно, это ближе к тому, чего вы пытаетесь достичь.

Function AverVisibleIC(Rg As Range, BU As Range)

    Dim xCount As long, xTtl As Double, i as long

    Application.Volatile

    Set Rg = Intersect(Rg.Parent.UsedRange, Rg)
    set bu = bu.cells(1).resize(rg.rows.count, rg.columns.count)

    For i=1 to Rg.cells.count
        If Rg.cells(i).ColumnWidth > 0 _
          And Rg.cells(i).RowHeight > 0 _
          And Not IsEmpty(Rg.cells(i)) _
          And IsNumeric(Rg.cells(i).Value) _
          and cbool(instr(1, bu.cells(i).value2, "IC", vbtextcompare)) Then
              xTtl = xTtl + Rg.cells(i).Value2
              xCount = xCount + 1
        End If
    Next i

    If xCount > 0 Then
         AverVisibleIC = xTtl / xCount
    End If

End Function
Другие вопросы по тегам