В общем, формулы оказались ни при чем. Точнее, "при чем", но как бы не по своей воле.
Всему "виной" программное построение диаграммы, которое, как выяснилось, весьма капризно, и успешное завершение этого процесса зависит даже от последовательности операторов. Например, поменяйте местами два самых последних оператора (казалось бы, абсолютно независимых) в нижеследующем демонстрационном джобе и вы получите сообщение об ошибке.
Что касается формул, то всё получилось, как хотелось, после помещения кода по их созданию перед кодом для создания диаграммы. Опять-таки, если хотите увидеть, какие с ними были проблемы, перенесите код по "организации непрерывного диапазона" в место перед оператором series.XValues (см. комментарии).
X++:
{
ComExcelDocument_RU doc = new ComExcelDocument_RU();
COM xlApp;
COM wbook;
COM activeSheet;
int i;
COM charts;
COM activeChart;
COM rangeOutputHeader;
COM range;
COM seriesCollection;
COM series;
;
doc.NewFile();
wbook = doc.getComDocument();
xlApp = wbook.Parent();
activeSheet = xlApp.ActiveSheet();
// генерация тестовых данных для примера
for (i=1; i<=10; i++)
doc.insertValue(ComExcelDocument_RU::numToNameCell(i,1), i*10);
// тестовые значения для XValues
for (i=5; i<=23; i+=2)
doc.insertValue(ComExcelDocument_RU::numToNameCell(i,2), strFmt('Категория %1', i));
// организация непрерывного диапазона в AA2:AJ2
range = activeSheet.Range('AA2');
for (i=22;i>=13;i--)
{
range.FormulaR1C1(strFmt('=RC[-%1]', i));
range = range.Offset(0, 1);
}
rangeOutputHeader = activeSheet.Range('AA2:AJ2');
// построение диаграммы
charts = wbook.Charts();
activeChart = charts.Add();
activeChart.ChartType(5); // 5 = xlPie
activeChart.SetSourceData(activeSheet.Range('A1:J1'));
series = activeChart.SeriesCollection(1); // немного странно, что это работает, не требуя промежуточного series = seriesCollection.Item(1);
// если организацию непрерывного диапазона перенести сюда,
// то будут описанные выше проблемы с формулами
series.XValues(rangeOutputHeader); // и, как хотелось, здесь Range, а не стринг
activeChart.Location(2, activeSheet.Name()); // 2 = xlLocationAsObject
}
P.S. Можно попробовать при "организации непрерывного диапазона" использовать формулу массива и тогда компактность кода уже может поспорить даже с перечислением адресов через запятую:
X++:
// организация непрерывного диапазона в AA2:AJ2
rangeOutputHeader = activeSheet.Range('AA2:AJ2');
rangeOutputHeader.FormulaArray('=INDEX(RC[-22]:RC[-4],{1,3,5,7,9,11,13,15,17,19})');
// построение диаграммы