Как усреднить видимые / отфильтрованные ячейки в диапазоне, отвечающем критериям другого диапазона в функции 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