Да уже всё распутано, вроде. Глаза постом выше поднимите
if (comRange.MergeCells()) перед Insert надо поставить
и не comRangeОдин, а просто comRange там - идёт преобразование comRange по ходу.
Вот ваш метод:
X++:
void copyAndInsertBlock(str _bookMark, int _workSheet = 1)
{ #define.xlShiftDown(-4121)
COM comRange, comRange1;
int rowsNumber;
;
if (! m_comDocument)
throw error(strFmt("@DIS6401", this.getApplicationName()));
comRange = this.findRange(_bookMark, _workSheet);
if (! comRange)
{
return;
}
if (comRange.MergeCells())
{
comRange = comRange.Range('A1');
comRange = comRange.MergeArea();
}
rowsNumber = any2int(COM::createFromObject( comRange.Rows() ).Count());
comRange.Insert( #xlShiftDown ); // и выше добавить: #define.xlShiftDown(-4121)
comRange1 = comRange.Offset(-rowsNumber);
comRange.Copy(comRange1);
}