如何避免averageifs#DIV / 0!使用VBA

时间:2012-04-03 19:17:32

标签: excel vba excel-vba

我有以下代码:

Sheet1.Range("AB3").Value = Application.WorksheetFunction.AverageIfs( _
                                .Range("AB5:AB" & CStr(i)), _
                                .Range("AB5:AB" & CStr(i)), _
                                ">=0", .Range("AB5:AB" & CStr(i)), "<>N/A")

要获取范围的平均值并排除-ve值和N/A值,但有一段时间所有范围都为N/A,因此我收到以下错误:

unable to get the average property of the worksheetfunction class

为了避免这种情况我尝试了这个:

Sheet1.Range("AB3").Value = Application.WorksheetFunction.IfError( _
                                Application.WorksheetFunction.AverageIfs( _
                                .Range("AB5:AB" & CStr(i)), _
                                .Range("AB5:AB" & CStr(i)), ">=0", _
                                .Range("AB5:AB" & CStr(i)), "<>N/A"), "N/A")

但没有运气。任何帮助将不胜感激。

编辑:

在excel中它可以正常工作,但不能在vba中(在后面的代码中)

只需在excel中进行一些测试就可以了:

=IFERROR(AVERAGEIFS(AF5:AF10,AF5:AF10,"<>n/a"),"N/A")

在上面的公式中,如果范围“AF5:AF10”中的数据全部是“n / a”,则公式返回“N / A”,这是正确的。

2 个答案:

答案 0 :(得分:3)

我只是在代码中将公式应用于单元格。这里有两种方法,一种是将公式放在activecell中,然后在其上“粘贴”为一个值,一种评估公式,然后将该值放入activecell:

Sub Test1()
Dim i As Long

i = 10
Sheet1.Range("AB3").Formula = "=IFERROR(AVERAGEIFS(AF5:AF" & CStr(i) & ",AF5:AF" & CStr(i) & ",""<>n/a""),""N/A"")"
Sheet1.Range("B3").Value = Sheet1.Range("AB3").Value
End Sub

Sub Test2()
Dim strFormula As String
Dim i As Long

i = 10
strFormula = "=IFERROR(AVERAGEIFS(AF5:AF" & CStr(i) & ",AF5:AF" & CStr(i) & ",""<>n/a""),""N/A"")"
Sheet1.Range("AB3").Value = Application.Evaluate(strFormula)
End Sub

答案 1 :(得分:0)

我找到了另一个问题的解决方案:

避免:

unable to get the average property of the worksheetfunction class

从公式中删除WorksheetFunction

就是这样。