WorksheetFunction.AverageIf

时间:2017-03-17 18:49:52

标签: excel vba excel-vba

我当前的问题涉及使用AverageIf函数计算某些事件的平均时间(风味变化,尺寸变化和标签变更)。我编写了三个独立的代码段来计算每个事件的每个平均时间。所有三个部分都是相同的(相同的标准范围和平均范围),唯一的区别是标准。

但是,当我运行宏时,我收到以下错误:

  

运行时错误'1004'无法获取AvergeIf属性   WorkksheetFunction类

此错误仅发生在代码的标签更改部分。

我的一些故障排除:

  • 验证单元格中的字符串长度是否与代码
  • 中的字符串相同
  • 验证时间是否为数字格式
  • 检查范围

以下是我的代码片段:

'Set Criteria Range for Averages
Set crng = Range(Worksheets("DataImport").Cells(StartRowT, "E"), Worksheets("DataImport").Cells(LastRowT, "E"))
'Set Average time ranfe for Averages
Set trng = Range(Worksheets("DataImport").Cells(StartRowT, "G"), Worksheets("DataImport").Cells(LastRowT, "G"))

'Flavor Change
If I > 0 Then
    FlavorA = Application.WorksheetFunction.AverageIf(crng, "Flavor Change", trng)
Else
    FlavorA = 0
End If
'Size Change
If M > 0 Then
    SizeChangeA = Application.WorksheetFunction.AverageIf(crng, "Size Change", trng)
Else
    SizeChangeA = 0
End If
'Label Change
If J > 0 Then
    LabelA = Application.WorksheetFunction.AverageIf(crng, "Label Change", trng)
Else
    LabelA = 0
End If
  • 字母变量是事件总数的计数变量
  • crng是标准范围
  • trng是时间范围(平均范围)

我仍在尝试找出代码标签更改部分的运行时错误1004的确切原因。

2 个答案:

答案 0 :(得分:3)

如果条件不匹配(并且您获得#DIV / 0),那么这将在您的VBA中触发运行时错误。相反,您可以使用不会引发运行时错误的Application.AverageIf()版本(即删除WorksheetFunction),然后使用IsError()

测试返回值
Dim m

'Label Change
If J > 0 Then
    m = Application.AverageIf(crng, "Label Change", trng)
    LabelA = IIf(IsError(m),"value when no match", m)
Else
    LabelA = 0
End If

答案 1 :(得分:2)

导致此错误,因为您的crng范围内没有任何值为“标签更改”的值,因此您实际上尝试除以零 - #DIV/0

您可以在计算范围的平均值之前添加要测试的条件,使用下面的代码(每个平均值计算)

' at least once cell in the range has the value of "Label Change"
If WorksheetFunction.CountIf(crng, "Label Change") > 0 Then
    LabelA = Application.WorksheetFunction.AverageIf(crng, "Label Change", trng)
Else
    ' pop a message-box, or whatever you want
    MsgBox "'Label Change' value is not found in range " & crng.Address
End If