Excel VBA - Как добавить формулу динамического c массива - PullRequest
4 голосов
/ 10 апреля 2020

Я добавляю формулу к рабочему листу через VBA, которая должна быть:

=UNIQUE(IF(TableA[ColumnA]=A1,TableA[ColumnB],""))

При этом используется новая функция SPILL в Excel, чтобы получить список значений столбца B, где соответствующее значение в столбце A соответствует тому, что находится в ячейке A. Я также применяю функцию UNIQUE для удаления любых нескольких пустых ("") результатов.

Это прекрасно работает, если я вручную ввожу формулу в Excel, однако при использовании VBA для добавления В формуле Excel добавляет символы @ в формулу и заставляет ее отображать #VALUE!.

Строка VBA, используемая для добавления формулы:

=Cells(x,y).Formula = "=UNIQUE(IF(TableA[ColumnA]=A1,TableA[ColumnB],""""))"

Полученный результат в Excel это:

=@UNIQUE(IF(TableA[@[ColumnA]]=A1,TableA[ColumnB],""))

Что происходит и что я пропустил?

Заранее спасибо!

1 Ответ

6 голосов
/ 10 апреля 2020

Хороший вопрос, и я посмотрел его ...


Короче говоря:

Используйте =Cells(x,y).Formula2 вместо =Cells(x,y).Formula


Объяснение:

@, который показывает называется неявным оператором пересечения. Из документов MS:

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

Но почему оно появляется в вашем новом Excel O365? Ну, Range.Formula использует I IE (неявное пересечение), таким образом добавляя @, чтобы в основном отменить функциональность вашего динамического c массива. UNIQUE - это новая функция динамического массива c. Итак, чтобы записать это в коде, вы должны использовать свойство Range.Formula2 (или Range.Formula2R1C1, если вы используете R1C1 нотацию). В этих свойствах используется AE (оценка массива), и теперь он используется по умолчанию.

  • Здесь - информативный документ c от MS по теме, который объясняет разницу между Formula и Formula2 более подробно.

  • Если вы хотите узнать больше об операторе неявного пересечения, взгляните на this

  • Ранее я ответил на другой вопрос, касающийся неявного пересечения, с примером того, как это на самом деле работает здесь , если кому-то это интересно.

...