Что такое -- или как превратить ИСТИНА в 1, а ЛОЖЬ в 0?
ПРИМЕР: Необходимо подсчитать сколько текстовых значений в диапазоне А2:А6.
Функция =ЕТЕКСТ(A2:A6) вернёт массив {ИСТИНА:ЛОЖЬ:ИСТИНА:ИСТИНА:ИСТИНА}. Для того что бы просуммировать кол-во ИСТИНА необходимо применить преобразование ИСТИНА в 1. Сделать это можно несколькими способами:
1. Используя бинарное отрицание (--)
2. Используя умножение на единицу
3. Используя прибавление ноля
4. Используя возведение в первую степень
5. Используя функцию Ч()
В Excel есть так называемое неявное преобразование типов. Например,
формула ="2" * 3, перемножающая текстовое значение "2" на числовое,
автоматически преобразует текстовое значение "2" в числовое 2. Результат
будет равен 6, как будто перемножались два числа.
Такое преобразование происходит при любым математических действиях:
сложении, вычитании, умножении, возведении в степень и проч., включая
смену знака на противоположный. Так -"2" автоматически преобразуется в
отрицательное число -2.
А если еще раз сменить знак --"2", то получим число 2.
Если записать в ячейку формулу: =-(-"2") и с помощью меню Сервис -
Зависимости формул - Вычислить формулу - Вычислить(2 раза) посмотреть,
что с ней сделает Excel, то эволюция будет такой: -(-"2"), потом -(-2), а
затем 2.
Важно отметить, что если записать формулу без скобок =--"2", то --"2"
преобразуется в число 2 без промежуточных действий (в одно действие).
Аналогичные преобразования будут и при добавлении к текстовому значению
нуля ="911"+0, умножении текста на единицу ="02"*1 и прочих
математических действиях, не меняющих результата мат. выражения.
Подобные преобразования Excel выполняет не только с текстовыми значениями, но и с логическими:
=ЛОЖЬ+0 или =ЛОЖЬ*1 или =--ЛОЖЬ дает 0, так как логическое значение ЛОЖЬ автоматически преобразуется в 0 (ноль).
=ИСТИНА+0 или = ИСТИНА*1 или =-- ИСТИНА дает 1, так как логическое значение ИСТИНА автоматически преобразуется в 1.
Любое математическое действие само по себе запускает механизм
преобразования в числа текстовых значений математического выражения:
="3"+"5" выдает числовое значение 8
Собственно, поэтому =СУММПРОИЗВ(--(Выражение1=Условие); --(Выражение2))
можно заменить на =СУММПРОИЗВ((Выражение1=Условие)*(Выражение2)), т.к.
математическое действие умножения автоматически запускает механизм
преобразования типов множителей, и дополнительных преобразователей типа
двойного отрицания уже не требуется.
Ну и, наконец, почему всё же часто используют именно двойное отрицание, а не добавление нуля или умножение на единицу?
Ответ прост: двойное отрицание теоретически выполняется быстрее
умножения на 1, сложения с нулем и других математических действий.
Экономия времени вычисления небольшая, и по некоторым оценкам составляет
примерно 15%
Ответ прост: двойное отрицание теоретически выполняется быстрее умножения на 1, сложения с нулем и других математических действий. Экономия времени вычисления небольшая, и по некоторым оценкам составляет примерно 15%
При этом случае функция {=SUM(N(ISTEXT(A2:A6)))} считаеться медленным чем бинарное? Thanks in advance
Главную путаницу во всём этом создаёт то, что программирующие в VBA знают, что True=-1, False=0, а в формулах листа почему-то считается ИСТИНА=1, ЛОЖЬ=0 И поэтому предсказать, какой цифорвой вариант даст перемножение в VBA трёх логических значений ИСТИНА, полученных через Application.Worksheetfunction для меня по крайней мере затруднительно... То ли +1, то ли -1 ???