【问题标题】:How to average visible/filtered cells in a range meeting a criteria from another range in VBA Function?如何在满足 VBA 函数中另一个范围的条件的范围内平均可见/过滤的单元格?
【发布时间】:2018-07-06 18:51:54
【问题描述】:

我对此很陌生,所以我在处理这段代码时遇到了一些问题,希望能得到一些帮助。目标是在满足另一个范围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

谢谢!

【问题讨论】:

  • 所用范围的行和列是否都为零宽度/高度?
  • 为什么你将BU作为范围参数传入,然后将其重置为Set BU = Range("B13:B44")而不使用它?

标签: excel vba average


【解决方案1】:

根据Rg与已使用范围相交后剩余的大小重置BU范围。

您似乎只知道 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

【讨论】:

  • 它有帮助,它只平均可见单元格,但没有考虑“IC”。目标是,当我在 BU 范围内过滤“IC”时,它会给我其他 rng 的平均值,而不考虑“隐藏单元格/非 IC 单元格”。
  • 好的,我想我对你想要达到的目标有了更好的了解。 BU 应该检查 Rg 中的每个单元格。
  • 是的,完全正确。现在我尝试运行该函数,但它给出了“编译错误:无效的下一个控制变量引用”,并突出显示了“下一个 xCell”。
  • 我的错。是的,我在代码中犯了一个错误。解决方法是将 4 个字符换成一个其他字符。你能用常用的调试工具来判断我的错误吗?
  • 好吧,对不起,我在这里迷路了,哪些角色?而不是真正的调试部分,我想它不会让我进入调试,因为它是一个函数?再次抱歉,我刚开始学习..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多