9

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

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

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

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

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

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

Спасибо дио

5 ответов5

23

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

=!X!

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

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

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

12

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

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

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

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

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 в основном листе.
  • При необходимости вы можете скрыть вспомогательный лист.
  • Это быстрее, чем оценка в два раза.
  • Это не теряет точности.

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

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

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .