Как выполнить функцию SumIf или SumProduct с кодированием VBA для суммирования на нескольких листах? - PullRequest
0 голосов
/ 12 февраля 2020

Моя текущая формула в ячейке:

=IFERROR(SUMPRODUCT(SUMIF(INDIRECT("'"&Regions&"'!$C:$C"),$B4,INDIRECT("'"&Regions&"'!AI:AI"))),"")

Досадно, что AI: AI не изменит контрольную ячейку, когда я копирую поперек (только вниз)

Я хотел бы вынуть формулу из ячейки и вместо этого рассчитать ее через модуль. Любые идеи будут фантастичны c спасибо

1 Ответ

1 голос
/ 12 февраля 2020

В этой формуле

=IFERROR(SUMPRODUCT(SUMIF(INDIRECT("'"&Regions&"'!$C:$C"),$B4,INDIRECT("'"&Regions&"'!AI:AI"))),"")

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

Пример:

  1. =SUM(A:A)
    здесь A:A является реальным адресом, который изменится, если вы скопируете его в другую ячейку.
  2. =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 является изменчивой функцией. Это означает, что он пересчитывает каждый раз, когда изменяется любое значение любой ячейки.

Пример:

  1. =SUM(A:A)
    это будет только пересчитывать, если значение в A:A изменяется, если значение в B:B изменяет его, не влияет на пересчет этой формулы.
  2. =SUM(INDIRECT("A:A"))
    это будет пересчитано при любом изменении значения, даже если значение в B:B изменяет его, пересчитывает.

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

...