我有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
首先,避免使用.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