|
![]() |
#1 |
Участник
|
До кучи
![]() В настоящее время, я в подобных случаях вставляю формулу напрямую в шаблон Excel. Точнее, в шаблоне Excel создается только 2 строки деталировки и строка с итоговой формулой. Непосредственно перед вставкой данных вставляется нужное количество пустых строк как копии первой строки деталировки. 2 строки деталировки нужны для того, чтобы при вставке строк формула с суммой в итоговой строке автоматически меняла адреса ячеек диапазона. Для копирования строк в классе ComExcelDocument_RU сделал такой метод X++: /* Вставка указанного количества строк, как копии одной строки шаблона _rowTemplate - номер строки, которая будет размножена (скопирована) _rowsInsert - количество строк, вставляемых ПОД укаазнной строкой шаблона _workSheetId - номер листа Excel в котором это все происходит. Соответственно изменен и метод findRange() */ void rtg_insertRowsAsCopy(Row _rowTemplate, Row _rowsInsert, int _workSheetId = 1) { COM comRowSource; Row currentRow, insertedRows; MSOfficeBookMark_RU bookMark; ; #define.xlDown(-4121) if (_rowsInsert < 2) { return; } // Итерационный цикл // Вставляю сначала 1, потом 2, 4, 8 и т.п. строк на последнем шаге вставляю остаток строк currentRow = 1; while (currentRow < _rowsInsert) { if (currentRow * 2 <= _rowsInsert) { insertedRows = currentRow; currentRow += insertedRows; } else { insertedRows = _rowsInsert - currentRow; currentRow = _rowsInsert; } bookMark = int2str(_rowTemplate) + ":" + int2str(_rowTemplate + insertedRows - 1); comRowSource = this.findRange(bookMark, _workSheetId); comRowSource.copy(); comRowSource.insert(#xlDown); } // while (currentRow < _rowsInsert) } |
|
![]() |
#2 |
Moderator
|
Владимир, а в чём смысл этой прогрессивной (2,4,8,16...) вставки?
![]() Есть первая строка - "начало", есть вторая - "конец", есть третья - "сумма". Для добавления 100 строчек между "началом" и "концом" вручную требуется встать на 2-ю строку, расширить выделение до 101-й включительно и потом выполнить команду меню "Вставить" - "Строки". Все вставленные строки АВТОМАТИЧЕСКИ унаследуют формат первой строки - заливку, шрифт и т.п. НО, увы, не границы (borders)! О границах - ниже. Программно на VBA вставку 100 строчек можно выполнить одним оператором: Код: Rows("2:101").Insert Shift:=xlDown. На 1-й картинке ячейка B1 имеет жирную границу с четырех сторон. Ячейка B2 не имеет границы, или другими словами "имеет границы, отличные от ячейки B1". Поэтому на 3-й картинке границы в столбце B не копируются. На 4-й картинке одинаковые границы имеются у обеих ячеек. На 5-й - видим соответствующий результат. |
|
|
За это сообщение автора поблагодарили: Владимир Максимов (3). |