1

У меня есть два диапазона, RangeA и RangeB. Я хотел бы по существу сделать следующее:

=SUMPRODUCT(RangeA, 1/RangeB) / TotalItems

Чтобы получить средний процент. Однако оба диапазона могут иметь пустые ячейки, разбросанные по ним, и я хочу включить соответствующие ячейки из RangeA и RangeB только тогда, когда они не являются пустыми.

Я пробовал варианты на следующем:

=SUMPRODUCT((RangeA<>"")*RangeA, 1/((RangeB<>"")*RangeB)) / TotalItems

Но все, что я пробовал с SUMPRODUCT до сих пор, дает мне "# DIV/0!"msgstr "ошибка, потому что это просто приводит к преобразованию пробелов в нули (обратите внимание, что использование RangeB<>0 приводит к тому же результату).

Я мог бы легко использовать следующую пользовательскую функцию:

Function AvgPerc(Range1 As Range, Range2 As Range) As Single
    Dim ind As Integer, inVal As Single, outVal As Single, _
        Perc As Double, TotPerc As Double, valCount As Integer
    For ind = 1 To Range1.Rows.Count
        If IsNumeric(Range1.Item(ind, 1)) And IsNumeric(Range2.Item(ind, 1)) Then
            inVal = Range1.Item(ind, 1)
            outVal = Range2.Item(ind, 1)
            If inVal <> 0 And outVal <> 0 Then
                Perc = CDbl(outVal) / CDbl(inVal)
                TotPerc = TotPerc + Perc
                valCount = valCount + 1
            End If
        End If
    Next ind
    If valCount = 0 Then
        AvgPerc = 0
    Else
        AvgPerc = TotPerc / valCount
    End If
End Function

Однако для этого необходимо, чтобы рабочая книга была сохранена как функция с поддержкой макросов, и будут люди, использующие эту книгу, у которых не включены макросы, и я не хочу просить их включить макросы для чего-то простого: это (в дополнение к тому факту, что это может вызвать замешательство у людей, которые начнут использовать книгу позже, когда я не смогу объяснить, что происходит).

В конечном счете, я думаю, что смогу использовать именованные диапазоны, чтобы сделать это без макроса, но я не уверен, как удалить "# DIV/0!""результаты из именованного диапазона, и мне действительно нужно продублировать все поведение в пользовательской функции выше.

Пример данных:

Пример данных

Обратите внимание, что в идеале я бы мог включить пустые строки внизу каждого столбца, чтобы люди могли добавить больше данных позже.

2 ответа2

1

Если SUMPRODUCT() создает проблемы, не используйте его.

В C2 введите:

=IF(B2="","",A2/B2)

и скопировать вниз. затем в другой камере:

=AVERAGE(C2:C9999)

Вы можете избежать вспомогательного столбца с помощью формулы массива:

=SUM(IFERROR(A1:A100/B1:B100,""))/COUNT(B2:B100)

или же

=AVERAGE((IFERROR(A2:A101/B2:B101,"")))

Формулы массива должны вводиться с помощью Ctrl + Shift + Enter, а не только клавиша Enter .

0

Используемый вами подход ((RangeB<>"")*RangeB)) преобразует пустые значения в 0 , что, очевидно, дает ту же ошибку, когда он также является делителем.

Два подхода к использованию, которые работают в этом случае:

  • =SUM(IFERROR(A2:A5/B2:B5,0))
  • =SUMPRODUCT(A2:A5,IF(B2:B5=0,0,1/B2:B5))

Обе формулы массива, вы должны закончить их с помощью сочетания клавиш CTRL+SHIFT+ENTER

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .