Господа, мне наконец удалось получить это сообщение об ошибке: 0xE004002C The selected cells cannot be merged. The range partially intersects a merged cell. Воспроизвелось на OWC.Spreadsheet (и на 10, и на 11) и на Axapta 3.0. В Excel не воспроизвелось (интересно, о каком же "Excel" мы все-таки тут рассуждаем?

)
Суть проблемы не в номере строки, а в количестве выполненных операций Merge на одном листе - 32766. Это максимум. Далее вылетает вышеупомянутое сообщение.
Но обо всём по порядку. Вот джоб, реабилитирующий Excel (на каждом шаге по два Merge, и общее их кол-во значительно превышает 32766 - проблем нет):
X++:
{
COM rng = SysExcelApplication::construct().workbooks().add().worksheets().itemFromNum(1).range('A1').comObject();
COM wks = rng.Parent();
COM cells = wks.Cells();
int i;
;
COM::createFromObject(rng.Application()).Visible(true);
for (i=1; i<=65536-1; i+=2) // только Excel 2003 был в распоряжении
{
rng = wks.Range(cells.Item(i,1),cells.Item(i+1,1));
rng.Merge();
rng.Value2(i);
rng = wks.Range(cells.Item(i,2),cells.Item(i+1,2));
rng.Merge();
rng.Value2(i);
}
}
Вот джоб для Spreadsheet, с параллельным выводом в большой Excel значений счетчика - для визуализации момента ошибки (написан на базе моего джоба отсюда:
Табличный процессор)
X++:
{
Form form = new Form();
Args args = new Args();
FormRun formRun;
FormActiveXControl ss;
COM worksheet;
COM range;
COM cells;
int i;
COM rng = SysExcelApplication::construct().workbooks().add().worksheets().itemFromNum(1).range('A1').comObject();
COM wks = rng.Parent();
COM clls = wks.Cells();
int j;
;
COM::createFromObject(rng.Application()).Visible(true);
form.addDesign('Design');
args.object(form);
formRun = classFactory.formRunClass(args);
formRun.init();
formRun.design().caption('Табличный процессор');
ss = formRun.design().addControl(FormControlType::ActiveX, 'Spreadsheet');
//ss.className('{0002E541-0000-0000-C000-000000000046}'); // Microsoft Office Spreadsheet 10.0
ss.className('{0002E559-0000-0000-C000-000000000046}'); // Microsoft Office Spreadsheet 11.0
ss.heightMode(FormHeight::ColumnHeight);
ss.widthMode(FormWidth::ColumnWidth);
range = ss.Range('A1');
worksheet = range.Parent();
cells = worksheet.Cells();
j=0;
//for (i=1; i<=80000-1; i+=2)
//for (i=1; i<=32766; i++)
for (i=1; i<=20; i++)
{
j++; // вывод в Excel для визуализации счетчика
rng = COM::createFromVariant(clls.Item(j));
rng.Value2(j);
// вывод в Speadsheet
//range = ss.Range(cells.Item(i,1),cells.Item(i+1,1));
range = ss.Range(cells.Item(i,1),cells.Item(i,2));
range.Merge();
range.Value2(i);
//range = ss.Range(cells.Item(i,2),cells.Item(i+1,2));
//range = ss.Range(cells.Item(i,3),cells.Item(i,6));
//range.Merge();
//range.Value2(i);
}
formRun.run();
formRun.wait();
}
С джобом можно поиграться самостоятельно по-всякому (я уже поигрался, поэтому он такой лохматый с комментариями). Самый простой способ убедиться в числе 32766 это сгенерировать джобом небольшое число строк, скажем 100, а затем их скопировать вручную в Spreadsheet'е ниже. После того как число Merge достигнет 32766 дальнейшее копирование будет выполнено без объединения. Можно встать на последнюю merge-ячейку и разъединить ее. В этом случае опять появляется возможность выполнить однократное копирование объединенной ячейки. Если же ее попытаться скопировать в две строки, то объединенной она останется только в первой из них.
Ограничение 32766 действует в пределах текущего рабочего листа, которых в Spreadsheet'е по умолчанию три: Sheet1, Sheet2, Sheet3.