Невозможно назначить FormulaArray для выбранного объекта Excel Range в C#

Мой код C# управляет диапазонами Excel с помощью библиотеки Microsoft.Office.Interop.Excel. Мне нужно назначить массив формул для выбранного диапазона. Я пробовал различные методы, рекомендуемые онлайн, включая рекомендации Microsoft, но до сих пор не смог заставить его работать должным образом.

Я наблюдаю 2 вопроса:

Проблема 1. Назначение выглядит хорошо на поверхности: оно не вызывает сбоев, объекты ячеек в диапазоне показывают назначенное свойство.ArrayFormula, в формуле электронной таблицы каждая ячейка отображается в фигурных скобках. Однако массив формул фактически не связан: каждая ячейка в диапазоне может быть изменена отдельно, чего не допустит обычный массив формул. Он ведет себя так, как будто каждая ячейка имеет свой собственный массив формул из одной ячейки, независимый от других. Независимо от моих лучших усилий, это всегда так. Есть ли на самом деле правильно работающее решение этой проблемы?

Проблема 2. Моя формула массива содержит ссылку на другой диапазон (диапазон A), на который я должен ссылаться в стиле R1C1. Мне нужна формула массива в каждой ячейке в целевой точке диапазона к одному и тому же диапазону А. Почему-то у меня всегда получается, что каждая ячейка в целевом диапазоне имеет свою собственную версию формулы, ссылаясь на смещенную область "Диапазон А". Как сделать так, чтобы ссылка оставалась на месте, независимо от ячейки?

NB. Можно предположить, что проблема 2 вызывает проблему 1, но это не так: например, когда формула массива проста, например "=SIN(1)", проблема 1 все еще возникает.

Буду очень признателен за любые РАБОЧИЕ предложения. Заранее большое спасибо.

1 ответ

Решение

Никто не заинтересовался, однако я нашел решение и отвечу на свой вопрос.

По-видимому, назначение формулы массива Excel в коде C# работает только в том случае, если формула имеет стиль A1, а не стиль R1C1. В моем случае я начинал с формулы в стиле R1C1, поэтому требовалось преобразование в стиль A1. Это достигается путем назначения исходной формулы в стиле R1C1 верхней левой ячейке целевого диапазона:

topLeftCell.Formula = myR1C1Formula;  
// topLeftCell.FormulaR1C1 = myR1C1Formula also works

Присвоение этой конкретной ячейке гарантирует, что формула в стиле A1 содержит правильные ссылки. Верните преобразованную формулу в виде строки:

string formulaA1 = topLeftCell.Formula;

Получите ссылку на весь целевой диапазон путем изменения размера верхней левой ячейки:

Excel.Range newArrayRange = topLeftCell.Resize[height, width];

Операция изменения размера должна предшествовать следующему назначению. Наконец, назначьте формулу в стиле A1 для свойства FormulaArray всего целевого диапазона:

newArrayRange.FormulaArray = formulaA1; 

Это прекрасно работает без проблем и побочных эффектов.

Другие вопросы по тегам