2016-07-01 2 views
-1

Мне нужно перечислить пробег в столбце A каждого вхождения значения «4A» в столбце B, но счет должен быть сброшен до 0, если значение в столбце B равно " 2B».Функция COUNTIF, сброс счетчика, если значение равно

Я приложил образец моей книги, столбец А показывает, как мне нужно, чтобы счет работал. Я открыт для использования VB или формулы.

enter image description here

Или в текстовом формате:

| A | B | 
+---+----+ 
| 0 | 2B | 
| | 3A | 
| 1 | 4A | 
| | 4B | 
| | 4B | 
| 2 | 4A | 
| | 4B | 
| 3 | 4A | 
| | 9A | 
| 0 | 2B | 
| | 3A | 
| 1 | 4A | 
| | 4C | 
| 2 | 4A | 
| | 9A | 
| 0 | 2B | 
| | 3A | 
| 1 | 4A | 
| | 9A | 
| 0 | 2B | 
| | 3A | 
| 1 | 4A | 
| | 4C | 
| | 9A | 
| | 9B | 
| | 9Z | 
+0

Нужно ли скрывать повторяющиеся значения, как вы это делали в листе образца? – trincot

+2

Минус 1 для размещения изображения образцов данных. – Jeeped

+0

Добавлена ​​текстовая версия для тех, кто считает ее отсутствие проблематичным. – trincot

ответ

1

EDIT:

@Jeeped и @trincot предложил варианты лучше не массив. Я изменил их немного здесь:

@ формула Jeeped в:

=IF(OR(B1={"2B","4A"}), COUNTIF(INDEX(B:B,AGGREGATE(14, 6, ROW(B$1:B1)/(B$1:B1="2B"), 1)):B1, "4A"),"") 

После модификации он использует LARGE функцию в совокупности, а не SMALL и "" вместо TEXT(,).


@ формула trincot в:

=IF(OR(B2={"2B","4A"}),(B2="4A")*(1+IFERROR(INDEX(G:G,MATCH(MAX(G$1:OFFSET(G2,-1,0))+1,G$1:OFFSET(G2,-1,0))),0)),"") 

По сравнению с оригиналом, это было слегка отредактированный «IF-накрест», я также заменил магии 9999 с MAX([...]) + 1 и сделал это так, что вы можете просто вставить его в 1-я ячейка и перетащить, а не иметь две отдельные формулы для первой ячейки и последовательных.


Моя оригинальная версия:

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

У этого есть очевидный недостаток быть матричной формулой.

В ячейке "A1" вы можете написать:

=IF(OR(B1="2B",B1="4A"),SUM((B$1:B1="4A")*(ROW(B$1:B1)>MAX(ROW(B$1:B1)*(B$1:B1="2B")))),"") 

Это формула массива, так что вы должны подтвердить его с помощью Ctrl + Shift + Enter.

Затем вы можете перетащить его.

В основном, он подсчитывает количество вхождений «4A» в диапазоне, простирающемся от текущей строки до первой, при условии, что строки счетчика «4A» больше, чем эта последняя строка «2B».

+0

@ Jeeped - прошу просить меня в другом месте (из-за моей репутации) - что не так с размещением изображения образцов данных здесь? В этом случае требуется почти нулевое усилие для воспроизведения работоспособного примера. –

+0

Лучший пост, на который я могу указать, - [Почему не изображения кода и данных примера] (http://meta.stackoverflow.com/questions/285551/285557#285557) и [Отказывать скриншоты кода и/или ошибок] (http://meta.stackoverflow.com/questions/303812). Помимо этого, кто-то, кто просит помощи (и не показывает никаких оригинальных усилий), не должен ожидать, что несколько других пользователей будут перепечатывать свои данные, чтобы помочь им. – Jeeped

+0

Хорошая формула матрицы btw; Я обработал не-массив с AGGREGATE, выполняющим циклическую обработку, но ваш короче ('= IF (OR (B1 = {" 2B "," 4A "}), COUNTIF (INDEX (B: B, AGGREGATE (15, 6, ROW ($ 1: 1)/(B $ 1: B1 = "2B"), COUNTIF (B $ 1: B1, "2B"))): B1, "4A"), TEXT (,)) '). – Jeeped

0

Вот способ со стандартными (не массив) формул:

В A1 говоря:

=IF(B1="4A",1,0) 

В A2 говоря:

=IF(B2="2B",IF(INDEX(A:A,MATCH(9999,A$1:A1))>0,0,""), 
      IF(B2="4A",1+INDEX(A:A,MATCH(9999,A$1:A1)),"")) 

Drag/копировать А2 вплоть до остальные ячейки в столбце A.

Это приведет к созданию пробелов, в противном случае будет отображаться то же значение.

Если повторяющиеся значения не должны быть подавлены, то вы можете упростить формулу А2:

=IF(B2="2B",0,IF(B2="4A",1+A1,A1)) 

... и скопировать его.

Смежные вопросы