Требуется ПРОМЕЖУТОЧНЫЙ ИТОГ Excel, чтобы условно использовать суммы из разных столбцов

У меня есть довольно простой лист Excel 2007 с тремя столбцами; имя (столбец A), значение1 (столбец B) и значение2 (столбец C). Этот лист часто автоматически фильтруется по столбцу «Имя».

Внизу 2-го столбца я хочу выполнить условный ПРОМЕЖУТОЧНЫЙ ИТОГ столбца B с учетом любых фильтров со следующим правилом: если для данной строки столбец B равен 0, используйте значение для этой строки из столбца C, в противном случае столбец C следует игнорировать.

      A         B         C       
1   Name     Value1    Value2
2  Bob         100         6   <-- use 100, ignore 6 in Col C because B is non-zero
3  Bob         200             <-- use 200
4  Bob           0        50   <-- Col B=0, use C, thus 50 (and so on)
5  Bob         300
6  Ralph        10
7  Ralph        20         1   <-- use 20 from col B, ignore col 6.
8  Ralph         0        60
9  Ralph        50
10 Mary       1000
11 Mary       1200
12 Mary          0       250
13 Mary       1040       
14 Subtotal   4280

Теперь я могу получить общее значение, которое хочу, с помощью формулы:

= СУММПРОИЗВ (- (B2: B13 = 0), C2: C13) + ПРОМЕЖУТОЧНЫЙ ИТОГ (9; B2: B13)

Но использование SUMPRODUCT не позволяет ему соблюдать требование скрытых / отфильтрованных ячеек, например, фильтрация Мэри не приводит к уменьшению итога на 3690. И SUBTOTAL не может использовать ссылку на массив (B2: B13 = 0). Так что значительная часть моего мозга пытается сказать мне, что я могу подойти близко, но на самом деле не могу этого сделать. Но я (тоже?) Упрям, чтобы так быстро сдаться :)

Часть меня пытается сказать, что это невозможно сделать напрямую, не углубляясь в VBA, чего я бы предпочел избежать, если это возможно для этого решения. Я подумал, что стоит привлечь внимание других людей к проблеме, чтобы указать на решение (вероятно, очень простое), которого я просто не вижу.

РЕДАКТИРОВАТЬ 1: Одно очевидное решение, на которое я должен был указать, - это просто добавить четвертый столбец с простым выражением IF, а затем SUBTOTAL. Это, безусловно, работает, но я не могу адаптировать это к данной ситуации. Приведенная здесь таблица является всего лишь репрезентативным отрывком из гораздо большего, хорошо структурированного рабочего листа, поэтому добавление произвольного столбца не является вариантом.

РЕДАКТИРОВАТЬ 2: предоставленные мной образцы данных позволили сделать простой вывод, что прямой ПРОМЕЖУТОЧНЫЙ ИТОГ всех столбцов решит проблему, но реальные данные, из которых были извлечены эти данные, могут включать значения для столбца C. даже если столбец B не равен нулю. В этом случае столбец C должен быть проигнорирован - столбец B, если он есть, всегда имеет приоритет. Я соответствующим образом изменил исходную таблицу данных.


person David W    schedule 28.01.2013    source источник
comment
У меня сейчас нет ответа, но блин твой значок ...   -  person LittleBobbyTables - Au Revoir    schedule 28.01.2013
comment
LOL Это так близко, как я подошел к одному из них примерно за 18 месяцев ... чертова диета :)   -  person David W    schedule 28.01.2013
comment
Почему бы просто не добавить еще один столбец =IF(B2=0,C2,B2) и вместо этого вычислить промежуточный итог?   -  person Peter Albert    schedule 28.01.2013
comment
Образец таблицы, используемый для иллюстрации, извлечен из гораздо большей электронной таблицы, имеющей очень специфический формат, и поэтому у меня нет возможности добавить столбец. Это очень очевидное соображение, которое я должен был упомянуть в исходном посте - хороший улов.   -  person David W    schedule 28.01.2013
comment
Возможно, вот решение: stackoverflow.com/questions/759656/   -  person Jüri Ruut    schedule 28.01.2013
comment
Спасибо @ JüriRuut, но это решение не решает условную проблему, которую я должен здесь решить. Тем не менее, спасибо!   -  person David W    schedule 28.01.2013
comment
Таким образом, вы на самом деле просто хотите суммировать столбцы B и столбец C, потому что, когда вам не нужны значения из B, они равны нулю, поэтому они не повлияют на общую сумму. Итак = ПРОМЕЖУТОЧНЫЙ ИТОГ (9; B2: B13) + ПРОМЕЖУТОЧНЫЙ ИТОГ (9; C2: C13)   -  person Dan    schedule 28.01.2013
comment
@Dan Close, но не совсем так, потому что я не хочу, чтобы задействовалось значение столбца C, если соответствующее значение столбца B не равно нулю. Ненулевое значение столбца B, если оно присутствует, превосходит все, что находится в столбце C. Эта формула добавляет все из обоих столбцов и, таким образом, не соблюдает это условие. Фактическая электронная таблица, из которой был предоставлен этот отрывок, может иметь значения в столбце C, когда столбец B не равен нулю, поэтому я должен изменить формулировку проблемы с этой целью.   -  person David W    schedule 28.01.2013
comment
= ПРОМЕЖУТОЧНЫЙ ИТОГ (9; СУММПРОИЗВ (- (B2: B13 = 0); C2: C13)) + ПРОМЕЖУТОЧНЫЙ ИТОГ (9; B2: B13)?   -  person Dan    schedule 28.01.2013
comment
Еще раз спасибо, @Dan, но это не сработает, поскольку SUBTOTAL ожидает ссылку на ячейку после первого аргумента, а SUMPRODUCT возвращает значение и, следовательно, не будет работать. Тем не менее, я очень ценю ваши усилия!   -  person David W    schedule 28.01.2013
comment
@JuriRuut Как я отмечал в исходном сообщении, я бы предпочел не идти по этому пути для этого решения, если это возможно. Я не буду полностью это исключать, но я бы предпочел сначала исчерпать варианты, не относящиеся к VBA.   -  person David W    schedule 28.01.2013
comment
Может ли этот пост вам помочь? blog.excelgeek.com/2010/11/   -  person Dan    schedule 28.01.2013
comment
Спасибо, @DanielOtykier! Я действительно видел тот самый пост в прошлую пятницу, и я надеялся, что поклеточная обработка, которую позволяет конструкция, могла бы дать решение, но, увы, этого не произошло. Я надеялся изменить это решение, чтобы использовать IF, который включал бы мое тестовое условие, но Excel отказался от этого. После нескольких различных перестановок мне, наконец, пришлось отказаться от этого угла.   -  person David W    schedule 28.01.2013
comment
@David W - Да, метод, на который указывает Дэниел, должен работать на вас - см. Мой ответ .......   -  person barry houdini    schedule 29.01.2013


Ответы (2)


Чтобы сделать это с помощью формул, хитрость заключается в том, чтобы использовать OFFSET для возврата «массива диапазонов», каждый из которых представляет собой отдельную ячейку, а затем мы можем использовать SUBTOTAL для запроса каждой ячейки. индивидуально, т.е. используя эту "формулу массива"

Изменить - согласно комментарию Даниэля Отыкьера - изначально этого не видел .....

=SUM(IF(SUBTOTAL(2,OFFSET(B2,ROW(B2:B13)-ROW(B2),0)),IF(B2:B13=0,C2:C13,B2:B13)))

подтверждено с CTRL+SHIFT+ENTER

Предполагает, что B2:B13 полностью заполнен согласно приведенному примеру

Изменить: вы также можете использовать эту версию, которая не требует «ввода массива»

=SUMPRODUCT(SUBTOTAL(9,OFFSET(C2,ROW(C2:C13)-ROW(C2),0)),(B2:B13=0)+0)+SUBTOTAL(9,B2:B13)

Такое использование SUBTOTAL/OFFSET было разработано Лораном Лонгре - см. здесь

person barry houdini    schedule 28.01.2013
comment
Кажется, это работает! Я видел упомянутый сайт раньше и много экспериментировал с трюком ROW / OFFSET, пытаясь включить IF в выражение, чтобы усилить оценку для каждой ячейки, но Excel постоянно жаловался на это. Оказывается, я просто вставил IF не в то место !! Спасибо большое. Похоже, это именно то, на что я надеялся. - person David W; 29.01.2013
comment
Нет проблем - я также добавил версию, более близкую к вашей оригиналу, которая не требует ввода массива ... - person barry houdini; 29.01.2013

Я сдался и отказался от UDF на основе VBA:

Function DifColSubTotal(Range1 As Range, Range2 As Range) As Single

  Dim c As Range
  Dim sum As Single
  Dim col_offset As Long

  col_offset = Range2.Column - Range1.Column

  For Each c In Range1
     If c.Height > 0 Then
       If ((c.Value = 0) Or (c.Value = "")) Then
           sum = sum + c.Offset(0, col_offset)
       Else
           sum = sum + c.Value
       End If
     End If
  Next
  DifColSubTotal = sum
End Function

Результат вот:

введите описание изображения здесь

person Jüri Ruut    schedule 28.01.2013
comment
Я очень ценю ваше время и усилия. Спасибо! - person David W; 28.01.2013
comment
Я полагаю, что для варианта с одной ячейкой это единственно возможное решение, формулы беспомощны для случая. +1! - person Peter L.; 28.01.2013