Ищите решение, чтобы сократить формулу IF


9

У меня есть длинная формула со следующей структурой:

=IF(!X!<>0,!X!+A1,"")

где ! х! это очень длинная формула.

Есть ли решение, чтобы избежать повторения! X! дважды? Мне это нужно по двум причинам:

  1. Сделать формулу удобочитаемой для пользователя листа
  2. Сократить время процесса

Я ценю любую помощь.

Спасибо дио


1
если вы хотите, To reduce the process timeто, очевидно, вам нужно где-то сохранить результат, в противном случае Excel должен пересчитать значение снова, когда условие совпадет. Деление тоже очень дорогая операция
phuclv

2
Просто любопытно, вы "играли в гольф" длинную формулу столько, сколько можете? Чтобы сделать его короче, возможно, добавить именованные диапазоны?
Брюс Уэйн

Чтобы сделать длинную формулу более читабельной, разделите аргументы на разные строки, используя alt + return. Один недостаток - если пользователь не увеличит высоту панели формул, формула выглядит неполной.
Брэд Смит

Ответы:


12

Другой подход заключается в использовании двойной инверсии :

=IFERROR(1/(1/really_long_formula)+A1,"")

Если really_long_formula принимает значение 0 , вы получите деление на ноль и IFERROR()будет поймать его!

Обратите внимание, что обычный способ (и лучший способ) выполнить это требование - использовать вспомогательную ячейку.


7
это может пострадать из-за потери точности из-за деления с плавающей запятой
phuclv

3
@ LưuVĩnhPhúc Вы совершенно правы! AFH подход является наилучшим подходом!
Студент Гари

Это хороший, грязный трюк. Я бы сильно воздержался от его использования, но, в крайнем случае, кто знает?
Андре Шалелья

3
ПРИМЕЧАНИЕ: это правда, что может быть некоторая потеря точности, но это редко будет актуальной проблемой. Я 1/1/xнесколько раз проверял в Excel 100 000 случайных чисел, и только в 1,4% случаев была ошибка округления. Максимальная относительная погрешность, которую я когда-либо нашел, была 1.6e-16, что, ну, фактически, ноль. Кроме того, что интересно, целые числа никогда не отображали ошибок округления (тестировалось несколько диапазонов от 0 до 1e14). Таким образом, этот ответ может быть осужден с точки зрения чистоты / чистоты, но не с точки зрения практических расчетов.
Андре Шалелья

1
Я считаю решение Гэри лучшим. Во-первых, потому что он чистый (как упомянуто также Андре) и читается другими пользователями. Во-вторых, потому что это удовлетворяет мою потребность. У меня нет сложных или длинных целых чисел. Я надеюсь, что пользователи, которые выберут этот подход, прочитают комментарии, чтобы быть в курсе плюсов и минусов этого решения.
Дио

23

Очевидный ответ - поместить формулу в рабочую ячейку подальше от основного листа. Например, если вы используете H1, установите его на:

=!X!

Ваша формула тогда становится:

=IF(H1<>0,H1+A1,"")

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


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

2
@ Дио, если его не видно, просто спрячьте колонку. Вы можете даже назвать столбец / диапазон, чтобы его было легче читать
phuclv

4
@ Дио - ОК. Ваш принятый ответ довольно умный, но имейте в виду, что из-за округления вы можете потерять точность ( 1/(1/x)не всегда точно такую ​​же x), особенно если вы имеете дело с целочисленными данными. Это также не применимо в более общем смысле (например, проверка на значение меньше нуля). (Комментарий скрещен с @ LưuVĩnhPhúc под принятым ответом.)
AFH

Спасибо за ваши советы и комментарии. Я оставлю вопрос открытым, чтобы увидеть, есть ли еще новые предложения.
Дио

2
Было бы полезно увидеть длинную формулу. Помимо рабочей ячейки, можно определить имя на рабочем листе, который содержит формулу
datatoo

3

Вам действительно нужен результат, чтобы оказаться ""в ложном деле? Если вам нужно, чтобы ячейка выглядела пустой (например, вы не будете использовать что-то похожее =ISNUMBER()на нее позже), вы можете использовать условное форматирование, чтобы скрыть содержимое в ложном регистре.

Условный формат , который вы будете применять к клетке так , чтобы она не отображает ничего есть пользовательский формат "", как это (это на португальском языке , но вы получите идею):

пользовательский формат для пустых ячеек

Формула в ячейке будет, как и ожидалось, просто =!X!+A1.

Формула условного форматирования может быть =!X!=0, но это приведет к пересчету !X!, который вам не нужен (ваша «точка 2»). Лучше использовать саму ячейку, используя =B1=A1(предположим, что наша ячейка B1 ) - это подразумевает !X! = 0.

Даже если вам нужно, чтобы содержимое ячейки было на самом деле "", обычно в таблицу можно вносить незначительные изменения, чтобы можно было использовать этот подход. Если это так, оставьте комментарий с описанием ситуации.


1

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

Если вы не можете добавить вспомогательный столбец , почему бы не добавить весь лист? Есть несколько преимуществ для этого:

  • Ваша вспомогательная ячейка не занимает место, которое в противном случае могло бы быть использовано, потому что оно находится на отдельном рабочем листе.
  • Вы можете назвать ячейку, а затем обратиться к ней по имени, например,=IF(X<>0,X+A1,"")
  • Если вам нужно сделать это более чем в одной ячейке, вы можете:
    1. Переименуйте вспомогательный лист в «Помощник»
    2. Поместите вспомогательное уравнение в ту же ячейку, что и основное уравнение (давайте назовем его D5.
    3. Адрес ячейки, как helper!D5на основном листе.
  • При необходимости вы можете скрыть вспомогательный лист.
  • Это быстрее, чем оценка в два раза.
  • Это не теряет точности.

Недостатки, которые я вижу:

  • Вы должны ссылаться на безымянные ячейки на основном листе, а sheetname!D5не просто D5.
  • Теперь формула состоит из двух частей вместо одной.
  • Распространение рабочего листа.

Взвешивая преимущества и недостатки, я думаю, что для многих вариантов использования это хорошее решение. Существуют ситуации, когда это не оптимально, хотя я не могу придумать ни одного в данный момент.


1
Отличный ответ. Недостатки, которые я вижу: 1. Это мало помогает в упрощении вычислений для пользователя, так как теперь большая формула скрыта. 2. Многие рабочие тетради уже заполнены листами. Даже если вы прячете это, вам, возможно, придется пройти через множество скрытых листов, чтобы скрыть это. Помимо этого, это хорошее решение.
Андре Chalella

@ AndréNeves Спасибо за это! Это первое пришло мне в голову, но я забыл об этом, когда писал статью о недостатках .
wizzwizz4

1

еще не предложенный вариант - создать пользовательскую функцию. Вам нужно будет включить вкладку «Разработчик» в строке меню (google it) и создать модуль.

 public function udf_myCalc(ValueToAdd as double)
    dim myvar as double
    dim udf_myCalc as double
    myvar = .. put the logic of !X! in here

    if myvar<>0 then 
        udf_myCalc = myvar + ValueToAdd
    else
        udf_myCalc = ValueToAdd
    end if
 end function

В строке формул вы бы сделали

=udf_myCalc(A1)

ПРИМЕЧАНИЕ. Теперь он становится файлом .xlsx (с макросами) и может нуждаться в дополнительных разрешениях в корпоративной сети, поскольку макросы можно использовать в злонамеренных целях, и некоторые фильтры электронной почты блокируют их. Функции недокументированы, поэтому вам нужно будет предоставить примечания о том, что делают ваши функции, и я считаю полезным вызывать все мои функции udf_xxxxx, чтобы было ясно, что это не встроенная функция

Есть и другие GOTCHA с UDF. Смотрите эту ссылку для некоторых хороших советов http://www.decisionmodels.com/calcsecretsj.htm

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.