2013-12-12 20 views
1

Я пытаюсь использовать CountIf в Excel (2010) с формулой в качестве критериев. Нечто подобное:CountIf в Excel с формулой в критериях

=CountIf(rawdata!$AK:$AK;bitAnd(rawdata!$AK:$AK;F$3)) 

тогда BitAnd является определенной пользователем функции VBA для побитового И-операции:

Public Function bitAnd(a As Integer, b As Integer) As Integer 
bitAnd = a And b 
End Function 

Задача состоит в том, чтобы подсчитать все строки, которые имеют определенный набор бит флага , Например, я хотел бы подсчитать все строки, у которых его LSB установлен в 1 (например, 0001, 0101, ...). То есть, сделать что-то вроде этого (в псевдокоде):

IF bitAnd(1;any number in the range) == 1 THEN count 

Очевидно, что это не работает с СЧЕТЕСЛИ, но есть ли другие элегантное решение с использованием формул (вместо кодирования пользовательских функций в VBA)? Какие-либо предложения?

+0

выполните расчет (критерии) в столбце рядом с данными ... укажите критерии счета для этих ячеек – Joop

ответ

1

использовать что-то вроде

=SUMPRODUCT(MOD(INT(($A3:$A19)/F$2),2)*1) 

Здесь $A3:$A19 является диапазон источника, чтобы проверить, F2 является =2^(F$1-1) и F1 является порядок бит вы хотите извлечь (1 является LSB и т.д.) Конечно, вы можете написать прямую формулу =SUMPRODUCT(MOD(INT(($A3:$A19)/2^(F$1-1),2))*1). Вы должны адаптировать абсолютное/относительное индексирование к вашим потребностям, чтобы иметь возможность удобно копировать и вставлять (как и при тестировании формул).

Обратите внимание, что это полезно для извлечения одного бита, как вы просили. «Построчно» побитовое И может быть построено на этой основе (хотя возможны и более вероятные варианты).

Для конкретного случая Excel 2013 (как сейчас, не ваша цель), с помощью функции BITAND листа вместе с COUNTIF или SUMPRODUCT должен поставить вас на пути, и здесь у вас есть «полный» побитовое И доступны (я не иметь Excel 2013, чтобы проверить это).

+0

Привет, это хороший подход, я этого не знал. Тем не менее, он работает только в том случае, если только один бит бит установлен в 1. В моем случае может случиться так, что есть несколько бит. Вот почему я попытался работать с поразрядным И. Есть ли у вас предложение справиться с этим? – user1707493

+0

@ user1707493 - Я не понимаю, что вы имеете в виду. Я тестировал это на всех числах * n * в интервале [0,17] (т. Е. Многие из них имеют более одного бита, установленного в 1), извлечение бит * b * # 1, # 2 или # 3, и оно работает , Например, * n и 0010b *. Как сказано, он не может вычислить * n и 0110b *, если это то, что вы имеете в виду. Я бы сделал google что-то вроде «excel bitwise and» (я на самом деле это сделал, попробовал пару опций, которые я нашел, никто не работал). Вероятно, это стоит другого вопроса, поскольку он интересен как закрытый вопрос сам по себе. –

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