尝试根据 ID 计算一系列数据的平均值、最小值和最大值
Posted
技术标签:
【中文标题】尝试根据 ID 计算一系列数据的平均值、最小值和最大值【英文标题】:Trying to calculate the average, min and max of a range of data depending their ID 【发布时间】:2020-07-21 00:20:45 【问题描述】:我有 2 列。一个带有名称,A 列,(COV,COSV,ETA ...),第二个带有数字。我在 A 列中有大约 40000 行和 30 个 dirrerent 名称。我在另一张表中有 A 列中所有不同的名称。
我想计算 A 列中每个名称的平均结果、最小值和最大值。因此,例如每个 COV 的 B 列中所有数字的平均结果。
我能够毫无问题地用 VBA 中的行计算平均结果。
WorksheetFunction.AverageIf
但我没有发现任何方法可以为 B 列的最小值和最大值做同样的事情。
编码需要在vba中。
有什么想法吗?
塞巴斯蒂安
这是部分代码
sub delais
Worksheets("delais_moyen").Select
lastrow = Range("C4", Range("C4").End(xlDown)).Rows.Count + 3
Worksheets(message3).Select
lastline = Range("D7", Range("D7").End(xlDown)).Rows.Count + 6
columnlettermin = Split(Cells(1, lastcol).Address, "$")(1)
columnlettermoy = Split(Cells(1, lastcol + 1).Address, "$")(1)
columnlettermax = Split(Cells(1, lastcol + 2).Address, "$")(1)
Worksheets("delais_moyen").Select
For j = 4 To lastrow
Set reponse = Sheets(message2).Range("D7:D" & lastline)
Set delais = Sheets(message2).Range("P7:P" & lastline)
reponsemin = columnlettermin & j
reponsemoy = columnlettermoy & j
reponsemax = columnlettermax & j
Range(columnlettermoy & j) = WorksheetFunction.AverageIf(reponse, Range("C" & j), delais)
next j
end sub
【问题讨论】:
听起来您的 Excel 版本不支持 MINIFS 和 MAXIFS? 我认为可以,excel 2013,但无法使其工作。有什么好的建议吗?我的 vba 编程水平充其量只是平均水平。 MInIf 和 MaxIf 都采用与 AverageIf 相同的参数。向我们展示您的尝试,以便我们了解问题所在。 刚刚看了看,minifs 和 maxifs 似乎只能在 excel 2016+ 中访问。很抱歉造成混乱,但我的 excel 是法语的。没有他们的任何想法 使用这个数组公式:'=AVERAGE(IF(Sheet1!A:A=A1;Sheet1!B:B)) CTRL+SHIFT+ENTER'。对 MAX 和 MIN 执行相同操作。 【参考方案1】:首先,避免使用.Select
甚至.Activate
、.ActiveCell
、.ActiveSheet
、.ActiveWorkbook
,正如这里所讨论的How to avoid using Select in Excel VBA。
其次,考虑 MINIFs
和 MAXIFs
在 VBA 中指示的公式数组函数,然后转换为最终值。注意:下面的单元格引用可能需要调整,因为您似乎在使用不同的工作表:
With Worksheets(message3)
lastline = .Range("D7", .Range("D7").End(xlDown)).Rows.Count + 6
columnlettermin = Split(.Cells(1, lastcol).Address, "$")(1)
columnlettermoy = Split(.Cells(1, lastcol + 1).Address, "$")(1)
columnlettermax = Split(.Cells(1, lastcol + 2).Address, "$")(1)
End With
With Worksheets("delais_moyen")
lastrow = .Range("C4", .Range("C4").End(xlDown)).Rows.Count + 3
For j = 4 To lastrow
' CREATE AGGREGATE ARRAY FORMULAS
.Range(columnlettermoy & j).FormulaArray = "=AVERAGE(IF(" & message2 & "!$P$2:$P$" & lastline & "=delais_moyen!C" & j & ", " & message2 & "!$D$2:$D$" & lastline & "))"
.Range(columnlettermin & j).FormulaArray = "=MIN(IF(" & message2 & "!$P$2:$P$" & lastline & "=delais_moyen!C" & j & ", " & message2 & "!$D$2:$D$" & lastline & "))"
.Range(columnlettermax & j).FormulaArray = "=MAX(IF(" & message2 & "!$P$2:$P$" & lastline & "=delais_moyen!C" & j & ", " & message2 & "!$D$2:$D$" & lastline & "))"
' CONVERT CELL FORMULAS TO VALUES
.Range(columnlettermoy & j) = .Range(columnlettermoy & j).Value
.Range(columnlettermin & j) = .Range(columnlettermin & j).Value
.Range(columnlettermax & j) = .Range(columnlettermax & j).Value
Next j
End With
【讨论】:
以上是关于尝试根据 ID 计算一系列数据的平均值、最小值和最大值的主要内容,如果未能解决你的问题,请参考以下文章
关于python计算的问题。怎样计算平均值,最大值和最小值???
2021-12-26:给定一个长度为n的数组arr,求有多少个子数组满足 : 子数组两端的值,是这个子数组的最小值和次小值,最小值和次小值谁在最左和最右无所谓。 n<=100000(10^5) n*(