Excel 试图根据数据的ID计算数据范围的平均值、最小值和最大值

Excel 试图根据数据的ID计算数据范围的平均值、最小值和最大值,excel,vba,max,average,min,Excel,Vba,Max,Average,Min,我有两个专栏。一个有名称,A列,(COV,COSV,ETA…),第二个有编号。我在A列中有大约40000行和30个目录名。我在另一张表中有A列中所有不同的名称 我想计算A列中每个名称的平均结果、最小值和最大值。因此,通过示例计算B列中每个COV的所有数字的平均结果 我能够用VBA中的行计算平均结果,没有任何问题 WorksheetFunction.AverageIf 但是我找不到对B列的最小值和最大值进行相同处理的任何方法 编码需要在vba中 有什么想法吗 塞巴斯蒂安 这是代码的一部分 sub

我有两个专栏。一个有名称,A列,(COV,COSV,ETA…),第二个有编号。我在A列中有大约40000行和30个目录名。我在另一张表中有A列中所有不同的名称

我想计算A列中每个名称的平均结果、最小值和最大值。因此,通过示例计算B列中每个COV的所有数字的平均结果

我能够用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

首先,避免使用
。选择
,甚至
。激活
.ActiveCell
.ActiveSheet
.ActiveWorkbook
,如下所述

<>第二,考虑公式>数组函数的<代码> MIIFS 和<代码> 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

首先,避免使用
。选择
,甚至
。激活
.ActiveCell
.ActiveSheet
.ActiveWorkbook
,如下所述

<>第二,考虑公式>数组函数的<代码> MIIFS 和<代码> 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

听起来你的Excel版本不支持MINIFS和MAXIFS?我想它支持,Excel 2013,但无法使其工作。有什么好建议吗?我的vba编程水平充其量是平均水平。MInIf和MaxIf的参数与AverageIf相同。向我们展示您的尝试,这样我们就可以看到问题所在。只要看看它,minifs和maxifs似乎只能在excel 2016+中访问。很抱歉搞混了,我的excel是法语的。没有它们的任何想法使用以下数组公式:'=AVERAGE(如果(Sheet1!A:A=A1;Sheet1!B:B))CTRL+SHIFT+ENTER。对MAX和MIN执行相同的操作。因此,听起来您的Excel版本不支持MINIFS和MAXIFS?我认为它支持,Excel 2013,但无法使其工作。有什么好建议吗?我的vba编程水平充其量是平均水平。MInIf和MaxIf的参数与AverageIf相同。向我们展示您的尝试,这样我们就可以看到问题所在。只要看看它,minifs和maxifs似乎只能在excel 2016+中访问。很抱歉搞混了,我的excel是法语的。没有它们的任何想法使用以下数组公式:'=AVERAGE(如果(Sheet1!A:A=A1;Sheet1!B:B))CTRL+SHIFT+ENTER。对最大值和最小值执行相同的操作。