5

Я пытаюсь настроить бюджетную рабочую тетрадь для моего личного бюджета, используя 13 листов, 1 для итогов и 12 для каждого месяца. Я не могу понять, почему формулы меняются, когда я вставляю строку в один из ежемесячных листов. Вот пример одной из формул, которые у меня есть:

=SUMIF(JUN!$G$2:$G$500,"Utilities", JUN!$D$2:$D$500)

Если я вставлю строку в верхнюю часть листа, она увеличит двойки до трёх, отбросив вычисления. Можно ли как-нибудь заблокировать изменение формулы? Это невероятно расстраивает.

2 ответа2

6

Что вам нужно понять, так это то, что абсолютность абсолютных ссылок, как указано в $ , не является абсолютно абсолютной ;-)

Теперь, когда эта скороговорка исчезла, позвольте мне объяснить.

Абсолютность применяется только при копировании-вставке или заполнении формулы. Вставка строк или столбцов слева от абсолютно ссылочного диапазона "сместит" адрес диапазона так, чтобы данные, на которые указывает диапазон, оставались неизменными.

Кроме того, вставка строк или столбцов в середине диапазона расширит его, чтобы охватить новые строки / столбцы. Таким образом, чтобы "добавить" строку данных в диапазон (таблицу), вам нужно вставить ее после первой строки данных.

Самый простой способ разрешить добавление строки данных выше текущего диапазона данных - всегда иметь строку заголовка и включать строку заголовка в фактический диапазон. Это как раз решение, предложенное cybernetic.nomad в этом комментарии.


Но осталась еще одна проблема - добавление строки данных после конца таблицы. Просто ввести новые данные в строке после последней строки данных не будет работать. Также не будет вставки строки перед строкой после последней строки.

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

Я обычно уменьшаю высоту строки и заполняю ячейки соответствующим цветом:

Скриншот рабочего листа

Для вашего примера, полная "простейшая" формула будет выглядеть так:

=SUMIF(JUN!$G$1:$G$501,"Utilities",JUN!$H$1:$H$501)


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

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

=SUMIF(INDEX(JUN!$G:$G,2):INDEX(JUN!$G:$G,COUNTA(JUN!$G:$G)),"Utilities",INDEX(JUN!$H:$H,2):INDEX(JUN!$H:$H,COUNTA(JUN!$G:$G)))

Это лучшее решение, чем использование INDIRECT() качестве

  1. Он является энергонезависимым и, следовательно, рабочий лист вычисляется быстрее, и
  2. Это не сломается, если вы вставите столбцы слева от таблицы.

Техника динамических формул может быть дополнительно улучшена путем использования ее в именованной формуле.



Конечно, лучшее решение - преобразовать таблицу в правильную таблицу и использовать структурированные ссылки.

2

Итак, вы говорите, что, если вы вставите новую строку 2 (между текущей строкой 1 и строкой 2), вы хотите, чтобы формула смотрела на новую строку 2?  Вот несколько вариантов:

=SUMIF(INDIRECT("JUN!$G$2:$G$500"),"Utilities", INDIRECT("JUN!$D$2:$D$500"))

всегда будет смотреть на строки со 2 по 500, независимо от того, будут ли строки перенумерованы вставками (или удалениями).  Это означает, что если вы вставите строку, исходная строка 500 будет перенумерована в 501 и будет вытеснена из диапазона.  Если вы хотите посмотреть текущую строку 2 через оригинальную строку 500, используйте

=SUMIF(INDIRECT("JUN!$G$2"):JUN!$G$500,"Utilities", INDIRECT("JUN!$D$2"):JUN!$D$500)

В случае, если это не очевидно, INDIRECT() принимает строковый (текстовый) аргумент и интерпретирует его как адрес.  Это позволяет вам выполнять инвариантную адресацию, потому что строки (которые выглядят как адреса) не будут корректироваться, когда другие адреса корректируются из-за вставки / удаления строки / столбца.

Обратите внимание, что символы $ в адресных строках являются необязательными; они не имеют никакого эффекта.

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