尝试根据其ID计算一系列数据的平均值,最小值和最大值

问题描述 投票:1回答:1

我有2列。一个带有名称A列(COV,COSV,ETA ...),第二个带有编号。我在A列中有大约40000行,带有30个直接名称。在另一张工作表中,我在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 vba max average min
1个回答
0
投票

首先,避免使用.Select,甚至避免使用.Activate.ActiveCell.ActiveSheet.ActiveWorkbook,如此处How to avoid using Select in Excel VBA所述。

[其次,请考虑MINIFsMAXIFs的公式数组函数,如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
© www.soinside.com 2019 - 2024. All rights reserved.