Показать сообщение отдельно
Старый 05.02.2009, 14:26   #12  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
С претензией на универсальность
Размялся. Набросал метод (excelInsertSumBelowColumns), помещающий суммирующие ячейки в заданный итоговый диапазон под колонками с данными (_rangeSum). Если в диапазоне несколько ячеек, то суммирующие формулы будут созданы для каждого столбца над этими ячейками. Если заданный итоговый диапазон содержит более одной строки (случайно, ошибочно), то формулы будут помещены только в первую строку этого диапазона. Второй и третий необязательные параметры - первая и последняя строка суммирования данных (имеется ввиду номер строки Excel). Если эти параметры не указаны, то в конкретном столбце суммируются все ячейки, начиная со строки 1 и кончая строкой перед ячейкой с суммой.

В рамках примера демонстрируется в виде вложенной функции. В приложении может жить - как больше нравится: либо как метод класса ComExcelDocument_RU, либо как статический метод класса Global, либо как еще фантазия подскажет (я лично помещу статический метод в персональный "Global").
X++:
static void Job134(Args _args)
{
    ComExcelDocument_ru excel = new ComExcelDocument_RU();
    COM app;
    COM book;
    COM range;

/////////////////////////////////////////////////////////
    void excelInsertSumBelowColumns(COM _rangeSum,
                                    int _rowFirst   = 1,
                                    int _rowLast    = 0)
    {
        COM range1;
        int rowSum;
        ;
        range1 = _rangeSum.Rows();
        range1 = COM::createFromVariant(range1.Item(1));

        rowSum = range1.Row();

        if (rowSum == 1)
        {
            warning('Нечего суммировать!');
            return;
        }

        if (_rowFirst < 1)
            _rowFirst = 1;

        if (_rowFirst >= rowSum)
            _rowFirst = rowSum - 1;

        if (!_rowLast || _rowLast >= rowSum)
            _rowLast = rowSum - 1;

        if (_rowLast && _rowLast < _rowFirst)
            _rowLast = _rowFirst;

        range1.FormulaR1C1(strFmt('=SUM(R[-%1]C:R[-%2]C)',
                           rowSum-_rowFirst, rowSum-_rowLast));
    }
/////////////////////////////////////////////////////////
    ;

    excel.newFile("", false);

    book = excel.getComDocument();
    app = book.Parent();

    range = app.range("A10:F10");

    excelInsertSumBelowColumns( range );

    excel.visible(true);
}
За это сообщение автора поблагодарили: tolstjak (1), zZ_TOP_Zz (1), player (1).