1

Тема: Объект oExcel

С Новым Годом! smile

Собственно, вопрос по объекту oExcel.
Есть Excel-шаблон, в него макросом вставляются данные.
Иногда нужно "вставить строку" - как?

Как я понимаю, если писать на VBA, то получается как-то так:

    Range("A21").Select
    Selection.EntireRow.Insert
    Rows("22:22").Select
    Selection.Copy
    Rows("21:21").Select
    Application.CutCopyMode = False
    Rows("22:22").Select
    Selection.Copy
    Rows("21:21").Select
    ActiveSheet.Paste
    Rows("22:22").Select
    Application.CutCopyMode = False
    Selection.ClearContents

Такими странными действиями добавляем строку выше, копируем в новую строку текущую с содержимым и форматированием и очищаем текущую строку от данных.
Сходу не получилось добавить аналогичную строку ниже sad

Как это переписать в макрос Универсал-а?

2 Отредактировано Yury Vitovsky (2017-01-10 18:18:21)

Re: Объект oExcel

Я не понял, зачем столько кода, чтобы вставить пустую строку. Достаточно первых двух строк.
А с учетом специфики макросов Универсала они должны выглядеть примерно так:

LOCAL oSheet, oRange
oSheet := oExcel:ThisWorkbook:ActiveSheet
oRange := oSheet:Range("A21")
oRange:EntireRow:Insert()

Ну и дальше заполняем нужные ячейки:

oSheet:Cells(21,1) = "AAAAAAAAAAAAAAAA"

3

Re: Объект oExcel

Я не понял, зачем столько кода, чтобы вставить пустую строку. Достаточно первых двух строк.
Недостаточно sad
Так строка вставляется выше текущей строки с частичным форматированием от высшей строки.

Т.е., объединенные ячейки, цвет/шрифт ячеек, обрамление - получается "шопопало"...

4 Отредактировано Yury Vitovsky (2017-01-10 19:02:53)

Re: Объект oExcel

Согласен, если нужно сохранить форматирование путем копирования из нижестоящей строки, то к нужно сохранить тот код, переписав его в нотации, что я привел.
Вместо конструкций типа:

Rows("22:22").Select
Selection.Copy

нужно использовать:

oRange := oSheet:Range("22:22")   //или oSheet:Range(Cells(22, 1), Cells(22, 1)):EntireRow
oRange:Copy()

Ну и т.д.
Т.е. к диапазонам нужно обращаться не через Selection, а определив их как объектные переменные.

5

Re: Объект oExcel

Кстати, Юра был более близок к простому решению (в том смысле, что пары строчек достаточно):

   oSql:skip()

   IF i < oSql:DataArea:CountSD
      oRange := oSheet:Range("A"+Cell):EntireRow:Copy
      oRange := oSheet:Range("A"+Cell):EntireRow:Insert
      oRange := oSheet:Range("A"+AllTrim(STR(VAL(Cell)+1))):ClearContents
   ENDIF

   i++
ENDDO

Специально вставил с куском цикла, где проверяется необходимость вставки строки.
В Excel 2010 работает