Показать сообщение отдельно
Старый 15.10.2008, 14:06   #18  
Gustav is offline
Gustav
Moderator
Аватар для Gustav
SAP
Лучший по профессии 2009
 
1,858 / 1152 (42) ++++++++
Регистрация: 24.01.2006
Адрес: Санкт-Петербург
Записей в блоге: 19
Цитата:
Сообщение от Poleax Посмотреть сообщение
X++:
    range = xlApp.Range('test');
    n=doc.getCellName_RowNum("test");
    range1 = range;
    for (i=1;i<=10;i++)
    {
       // в цикле только пишем значения, не форматируем
        // адрес не зависит от счетчика цикла
        doc.insertRow(n,1,i);
        doc.insertValue( range1.Address(), i);
         range1 = range1.Offset(1,0);
    }
Я немножко подправил фрагмент и упростил, отказавшись от range1 и его переопределений внутри цикла. Несмотря на зловещее выражение для вычисления адреса для insertValue, в нем используется вполне прозрачное для понимания свойство Item, которое удобно следует за счетчиком цикла. Пусть это будет вариант 5
X++:
    range = xlApp.Range('test');
    //n=doc.getCellName_RowNum("test");
    n = range.Row(); // раз уж переменную range определили, то чего так далеко за строкой лазить :)

    for (i=1;i<=10;i++)
    {
        // поменял операции местами для удобства понимания: 
        // т.е. сначала записываем значение, а потом добавляем строку ниже
        doc.insertValue(any2str(COM::createFromVariant(range.Item(i, 1)).Address()), i);
        doc.insertRow(n, 1, i);
    }

    // удаляем последнюю строку - она всегда лишняя (здесь i=11)
    doc.deleteRow(any2int(COM::createFromVariant(range.Item(i, 1)).Row()));

    // после цикла ячейка test так и остается первой (верхней) ячейкой обработанного диапазона