查找符合特定条件的最后 n 个条目的平均值 - Excel
Find average for nth last entries matching a certain condition - Excel
我想找到一个公式,使我能够立即计算出以下两个公式分别计算的内容。该公式必须忽略空白单元格。
1) 一个公式,使我能够计算列中倒数第 n 个条目的平均值并忽略空白单元格(使用 CTRL+SHIFT+ENTER 输入)
=AVERAGE(IF(ROW(A1:A10)>=LARGE(IF(A1:A10,ROW(A1:A10)),nth),IF(A1:A10,A1:A10)))
2) 如果在相邻列中满足特定条件(使用 CTRL+SHIFT+ENTER 输入),则计算平均值的公式
=AVERAGE(IF(A1:A10="CONDITION",B1:B10))
当然,我必须手动输入"nth value"以及条件。
这个例子演示了我想要完成的事情(见下面的文字)
条件为 "Blue" 的最后两个条目的平均值是多少? (7.5)
条件为 "Red" 的最后三个条目的平均值是多少? (7)
等等
再次请注意空白单元格。
首先在标准模块中输入如下UDF()(User Defined Function):
Public Function averaje(s As String, nItems As Long, r1 As Range, r2 As Range) As Variant
Dim N As Long, Kount As Long, i As Long
Dim n1 As Long, n2 As Long, c1 As Long, c2 As Long
Dim wf As WorksheetFunction
Set wf = Application.WorksheetFunction
n1 = 0
n2 = 0
c1 = r1.Column
c2 = r2.Column
N = Cells(Rows.Count, c1).End(xlUp).Row
Kount = 0
For i = N To 1 Step -1
If Cells(i, c1).Value = s Then
If n1 = 0 Then n1 = i
Kount = Kount + 1
n2 = i
If Kount = nItems Then GoTo DONE
End If
Next i
averaje = "Not enough items"
Exit Function
DONE:
averaje = wf.Average(Range(Cells(n1, c2), Cells(n2, c2)))
End Function
用户定义函数 (UDF) 非常易于安装和使用:
- ALT-F11 调出 VBE window
- ALT-I
ALT-M 打开一个新模块
- 粘贴内容并关闭 VBE window
如果您保存工作簿,UDF 将随之保存。
如果您使用的 Excel 版本晚于 2003,则必须保存
文件为 .xlsm 而不是 .xlsx
删除 UDF:
- 如上所述调出 VBE window
- 清除代码
- 关闭 VBE window
要使用来自 Excel 的 UDF:
=averaje("Red",3,A:A,B:B)
要了解有关宏的更多信息,请参阅:
http://www.mvps.org/dmcritchie/excel/getstarted.htm
和
http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx
有关 UDF 的详细信息,请参阅:
http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx
必须启用宏才能运行!
例如:
您可以使用此数组公式计算最后 3 个非空白蓝调的平均值
=AVERAGE(IF(A1:A10="Blue",IF(ISNUMBER(B1:B10),IF(ROW(B1:B10)>=LARGE(IF(A1:A10 ="Blue",IF(ISNUMBER(B1:B10),ROW(B1:B10))),3),B1:B10))))
根据需要更改条件和 n 值。
如果没有 3 个非空白蓝调,您期望什么结果?通过以上你会得到一个#NUM!错误
我想找到一个公式,使我能够立即计算出以下两个公式分别计算的内容。该公式必须忽略空白单元格。
1) 一个公式,使我能够计算列中倒数第 n 个条目的平均值并忽略空白单元格(使用 CTRL+SHIFT+ENTER 输入)
=AVERAGE(IF(ROW(A1:A10)>=LARGE(IF(A1:A10,ROW(A1:A10)),nth),IF(A1:A10,A1:A10)))
2) 如果在相邻列中满足特定条件(使用 CTRL+SHIFT+ENTER 输入),则计算平均值的公式
=AVERAGE(IF(A1:A10="CONDITION",B1:B10))
当然,我必须手动输入"nth value"以及条件。
这个例子演示了我想要完成的事情(见下面的文字)
条件为 "Blue" 的最后两个条目的平均值是多少? (7.5)
条件为 "Red" 的最后三个条目的平均值是多少? (7)
等等
再次请注意空白单元格。
首先在标准模块中输入如下UDF()(User Defined Function):
Public Function averaje(s As String, nItems As Long, r1 As Range, r2 As Range) As Variant
Dim N As Long, Kount As Long, i As Long
Dim n1 As Long, n2 As Long, c1 As Long, c2 As Long
Dim wf As WorksheetFunction
Set wf = Application.WorksheetFunction
n1 = 0
n2 = 0
c1 = r1.Column
c2 = r2.Column
N = Cells(Rows.Count, c1).End(xlUp).Row
Kount = 0
For i = N To 1 Step -1
If Cells(i, c1).Value = s Then
If n1 = 0 Then n1 = i
Kount = Kount + 1
n2 = i
If Kount = nItems Then GoTo DONE
End If
Next i
averaje = "Not enough items"
Exit Function
DONE:
averaje = wf.Average(Range(Cells(n1, c2), Cells(n2, c2)))
End Function
用户定义函数 (UDF) 非常易于安装和使用:
- ALT-F11 调出 VBE window
- ALT-I ALT-M 打开一个新模块
- 粘贴内容并关闭 VBE window
如果您保存工作簿,UDF 将随之保存。 如果您使用的 Excel 版本晚于 2003,则必须保存 文件为 .xlsm 而不是 .xlsx
删除 UDF:
- 如上所述调出 VBE window
- 清除代码
- 关闭 VBE window
要使用来自 Excel 的 UDF:
=averaje("Red",3,A:A,B:B)
要了解有关宏的更多信息,请参阅:
http://www.mvps.org/dmcritchie/excel/getstarted.htm
和
http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx
有关 UDF 的详细信息,请参阅:
http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx
必须启用宏才能运行!
例如:
您可以使用此数组公式计算最后 3 个非空白蓝调的平均值
=AVERAGE(IF(A1:A10="Blue",IF(ISNUMBER(B1:B10),IF(ROW(B1:B10)>=LARGE(IF(A1:A10 ="Blue",IF(ISNUMBER(B1:B10),ROW(B1:B10))),3),B1:B10))))
根据需要更改条件和 n 值。
如果没有 3 个非空白蓝调,您期望什么结果?通过以上你会得到一个#NUM!错误