Попытка вычислить среднее, минимальное и максимальное значения диапазона данных в зависимости от их идентификатора. - PullRequest
1 голос
/ 08 апреля 2020

У меня есть 2 столбца. Один с именем, столбец A, (COV, COSV, ETA ...), а второй с номером. У меня есть около 40000 строк с 30 разными именами в столбце А. У меня на другом листе все другие имена в столбце А.

Я хочу вычислить средний результат, минимальные значения и максимальные значения для каждое имя в столбце А. ТАК средний результат всех чисел в столбце 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

1 Ответ

0 голосов
/ 09 апреля 2020

Прежде всего, избегайте использования .Select и даже .Activate, .ActiveCell, .ActiveSheet, .ActiveWorkbook, как описано здесь Как не использовать Select в 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
...