2012-04-03 395 views
1

我有下面的代码:如何避免averageifs#DIV/0!使用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”,这是正确的。

+0

你可以更清楚'在Excel中它工作吗?你期望哪个公式?你打算做什么? – JMax 2012-04-03 19:55:45

+0

请参考上面编辑thx – Somebody 2012-04-03 20:00:06

+2

不回答问题(!),但请注意,AVERAGEIFS将忽略文本值,如N/A,所以你不需要明确排除 - 这个公式应该足够了= = AVERAGEIF(AF5:AF10 ,“> = 0”)' – 2012-04-03 20:05:57

回答

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 
+0

我仍然无法获得工作表函数类的平均属性,我猜是与公式本身相关的东西,而不是结果分配给单元格的方式。 – Somebody 2012-04-03 21:00:38

+0

我建议的代码段中没有“工作表功能”。您是否完全按照上述方式使用代码?我会为“工作表功能”做一个Ctrl-F,并确保你摆脱了它。 – 2012-04-03 21:11:19

+0

如果我没有在特定函数之前放置Application.WorksheetFunction,那么我有:'编译错误:Sub或Function not defined' – Somebody 2012-04-03 21:16:08

0

我发现了另一个解决我的问题:

避免:

unable to get the average property of the worksheetfunction class 

只是从配方中删除WorksheetFunction

就是这样。

+0

根据Chip Pearson的这篇文章,删除WorksheetFunction需要您更明确地测试错误:http://www.cpearson.com/Excel/CallingWorksheetFunctionsInVBA.aspx。查找“工作表函数的错误处理”部分。要点是:“如果包含WorksheetFunction属性,则错误将显示为运行时错误......如果不包含WorksheetFunction属性,则必须将结果变量声明为Variant类型并使用IsError函数测试该变量“。 – 2012-04-04 18:32:40