В этой формуле
=IFERROR(SUMPRODUCT(SUMIF(INDIRECT("'"&Regions&"'!$C:$C"),$B4,INDIRECT("'"&Regions&"'!AI:AI"))),"")
INDIRECT
использует строку / текст, который выглядит как адрес, но поскольку это только строка (вы можете видеть, что он находится в кавычки " "
) это не изменяется, когда оно копируется в другую ячейку. На самом деле это и есть цель INDIRECT
(чтобы она не не изменилась).
Пример:
=SUM(A:A)
здесь A:A
является реальным адресом, который изменится, если вы скопируете его в другую ячейку. =SUM(INDIRECT("A:A"))
здесь "A:A"
- строка, и это не изменится, если вы скопируете ее в другая ячейка!
Таким образом, вы можете обойти это, заменив
INDIRECT("'"&Regions&"'!$C:$C")
на
INDIRECT("'Regions'!" & ADDRESS(1,COLUMN(C:C)) & ":" & ADDRESS(ROWS(C:C),COLUMN(C:C)))
Как это работает?
ADDRESS(1,COLUMN(C:C))
возвращает $C$1
ADDRESS(ROWS(C:C),COLUMN(C:C))
возвращает $C$1048576
Вместе это будет $C$1:$C$1048576
, что равно C:C
. И поскольку здесь C:C
в вашей формуле является реальным адресом, а не строкой, он изменится, если вы его скопируете.
INDIRECT является изменчивым!
Обратите внимание, INDIRECT
является изменчивой функцией. Это означает, что он пересчитывает каждый раз, когда изменяется любое значение любой ячейки.
Пример:
=SUM(A:A)
это будет только пересчитывать, если значение в A:A
изменяется, если значение в B:B
изменяет его, не влияет на пересчет этой формулы. =SUM(INDIRECT("A:A"))
это будет пересчитано при любом изменении значения, даже если значение в B:B
изменяет его, пересчитывает.
Поэтому следует избегать интенсивного использования энергозависимых функций, поскольку это замедляет работу вашего рабочего листа много .