Макс из одной ячейки, а затем означает - PullRequest
0 голосов
/ 30 января 2020
      A
1    5,6
2    8,0

Что я хочу:

  • макс. Каждой ячейки (от: A1 => 6, A2 => 8)
  • среднее значение / среднее всех максимумов (от: (6+8)/2 = 7)
  • все это только с формулами (и без разделения клеток), возможно? (Скажите A3 = ваша хорошая формула , так что A3 показывает 7)

Добавление vba:

Sub maxAndMean()
    TotalNonZeroC = 0
    sumOfMax = 0
    For Each c In Selection
        If IsEmpty(c.Value) = False Then
            TotalC = TotalC + 1
            maxVal = "=Max(Left(c.Value, 1), Right(c.Value, 1))"
            'Not working formula^
            If maxVal != 0 Then
                sumOfMax = sumOfMax + maxVal
                TotalNonZeroC = TotalNonZeroC + 1
            End If
        End If
    Next c

    avg = sumOfMax / TotalNonZeroC
    'How to write avg to next cell(row) in the selected column?
End Sub

Ответы [ 3 ]

2 голосов
/ 30 января 2020

Чтобы получить MAX с формулой, если у вас Excel 2013 +

=MAX(FILTERXML("<t><s>" & SUBSTITUTE(A2,",","</s><s>") & "</s></t>","//s"))

Для AVERAGE, просто усредните столбец МАКС. И обратите внимание, что AVERAGE будет игнорировать пустые ячейки

EDIT

Еще один вариант, где формула AVERAGE должна ссылаться только на исходные данные:

MAX для каждой ячейки

=FILTERXML("<t><s>" & SUBSTITUTE(A2,",","</s><s>") & "</s></t>","//s[not(. < preceding::*) and not(. < following::*)]")

AVERAGE для диапазона

=AVERAGE(FILTERXML("<t><s>" & SUBSTITUTE(A2:A3,",","</s><s>") & "</s></t>","//s[not(. < preceding::*) and not(. < following::*)]"))

Формула AVERAGE является формулой массива. В некоторых версиях Excel, чтобы ввести / подтвердить формулу массива , удерживайте нажатой клавишу ctrl + shift при нажатии , введите . Если вы сделаете это правильно, Excel поместит фигурные скобки {...} вокруг формулы, отображаемой в строке формул.

enter image description here

Если у вас есть 2007-2010, Вы можете использовать для Макс:

=AGGREGATE(14,6,--TRIM(MID(SUBSTITUTE(A2,",",REPT(" ",99)),seq_99,99)),1)

, где

seq_99 refers to:  =IF(ROW($A$1:INDEX($A:$A,255,1))=1,1,(ROW($A$1:INDEX($A:$A,255,1))-1)*99)
0 голосов
/ 30 января 2020

С VBA все довольно просто:

Sub ExtractAverage()
    a1max = MaxFromArray(Split(Cells(1, 1), ","))
    a2max = MaxFromArray(Split(Cells(2, 1), ","))
    Cells(3, 1).Value = (a1max + a2max) / 2
End Sub
' note that you can easily find more optimal ways to find maximum of an array,
' This isn't the most optimal solution.
Function MaxFromArray(arr As Variant) As Long
    element = arr(LBound(arr))
    For Each e In arr
        If e > element Then
            element = e
        End If
    Next
    MaxFromArray = element
End Function
0 голосов
/ 30 января 2020

Это работает для вашего примера, но не будет масштабироваться как хорошее решение VBA.

A3 = ваша хорошая формула:

=AVERAGE(MAX(LEFT(A1;1);RIGHT(A1;1));MAX(LEFT(A2;1);RIGHT(A2;1)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...