Как вставить формулу delphi excel

6 / 6 / 0

Регистрация: 21.11.2010

Сообщений: 6

1

21.11.2010, 12:20. Показов 13001. Ответов 1


Студворк — интернет-сервис помощи студентам

Здравствуйте. Помогите пожалуйста с небольшой заковыкой.
Программа на Delphi формирует отчет на листе Excel
В строку Итого хочу вставить формулу суммирующую значения столбца
код: MyCell.Formula:=’=СУММ(B7:B’+IntToStr(6+i)+’)’;

На листе вместо итоговых значений в ячейке: #ИМЯ?
при щелчке на ячейке видно что это формула и если по формуле щелкнуть мышью
а потом нажать enter то в ячейке появляется сумма по столбцу.
Как сделать так чтобы не надо было дополнительно щелкать по каждой итоговой ячейке?



0



6 / 6 / 0

Регистрация: 21.11.2010

Сообщений: 6

22.11.2010, 14:51

 [ТС]

2

Разрешилось все достаточно просто, хотя и не очень понятно почему именно так
Код:
MyCell.Value:=’=SUM(b7:b’+IntToStr(6+i)+’)’;
То есть необходимо искать англоязычный эквивалент вставляемой функции.
И почему-то присваивать не MyCell.Formula:…. а именно MyCell.Value:=….

Всем спасибо. Особенно мне )))))



4



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

22.11.2010, 14:51

Помогаю со студенческими работами здесь

Как вставить формулу?
Здравствуйте! Нужно в Прайсе с цифрами добавить 10% увеличение стоимости с округлением в большую…

Как вставить формулу
Всем добрый день.
Прошу помощи знающих.
Сразу прошу простить: я совершенно не силён в тематике,…

Как вставить формулу
Подскажите как можно вставить формулу или таблицу с UserForm не получается что-то…Сделайте хоть…

Как формулу вставить ?
Подскажите как вставит в таблицу формулу для подсчета суммы

Добавлено через 7 минут
в Word 2007

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

2

>
Вставка формулы в Excel

  • Подписаться на тему
  • Сообщить другу
  • Скачать/распечатать тему



Сообщ.
#1

,
25.09.04, 17:40

    Full Member

    ***

    Рейтинг (т): 10

    Подскажите как вставить формулу в ячейку Excel.
    Пробовал так:

    ExpandedWrap disabled

      ASheetRef.Range[‘C19:C19′]:=’=СУММ(C6;C11;C14:C18)’;

    и вот так:

    ExpandedWrap disabled

      ASheetRef.Range[‘C19:C19′].Formula:=’=СУММ(C6;C11;C14:C18)’;

    И еще по всякому. Искал в интернете — ничего толкового не могу найти.

    Вылетает ошибка.

    И еще. Я в цикле (вернее в двух) перебираю ячейки и обрисовываю граници:

    ExpandedWrap disabled

          for i:=1 to PeriodCount + 2 do

          begin

              for j:=1 to INIT_ROW_COUNT do

              begin

                  ASheetRef.Cells[j,i].Borders[EDGE_TOP].LineStyle:=LINE_STYLE;

                  ASheetRef.Cells[j,i].Borders[EDGE_TOP].Weight:=LINE_WIDTH;

                  ASheetRef.Cells[j,i].Borders[EDGE_LEFT].LineStyle:=LINE_STYLE;

                  ASheetRef.Cells[j,i].Borders[EDGE_LEFT].Weight:=LINE_WIDTH;

                  ASheetRef.Cells[j,i].Borders[EDGE_BOTTOM].LineStyle:=LINE_STYLE;

                  ASheetRef.Cells[j,i].Borders[EDGE_BOTTOM].Weight:=LINE_WIDTH;

                  ASheetRef.Cells[j,i].Borders[EDGE_RIGHT].LineStyle:=LINE_STYLE;

                  ASheetRef.Cells[j,i].Borders[EDGE_RIGHT].Weight:=LINE_WIDTH;

              end;

          end;

    но все это происходит так меееееедленно. Нет ли способа ускорить процес?


    anika



    Сообщ.
    #2

    ,
    25.09.04, 22:51

      anika Newbie

      Рейтинг (т): 0

      По поводу второго могу порекомендовать убрать обновление экрана перед выполнением кода (_WordDoc как TWordDocument):

      ExpandedWrap disabled

        _WordDoc.Application.ScreenUpdating:=false;

      а самом конце обратно соответственно в true

      Добавлено 25.09.04, 23:07
      а формулу я присваивала как:

      ExpandedWrap disabled

        Sheet.Cells.Item[i,j].Value:=’=SUM(C6;C11;C14:C18)’


      Jureth



      Сообщ.
      #3

      ,
      27.09.04, 04:05

        Цитата rapido @ 26.09.04, 00:40

        И еще. Я в цикле (вернее в двух) перебираю ячейки и обрисовываю граници:

        ExpandedWrap disabled

              for i:=1 to PeriodCount + 2 do

              begin

                  for j:=1 to INIT_ROW_COUNT do

                  begin

                      ASheetRef.Cells[j,i].Borders[EDGE_TOP].LineStyle:=LINE_STYLE;

                      ASheetRef.Cells[j,i].Borders[EDGE_TOP].Weight:=LINE_WIDTH;

                      ASheetRef.Cells[j,i].Borders[EDGE_LEFT].LineStyle:=LINE_STYLE;

                      ASheetRef.Cells[j,i].Borders[EDGE_LEFT].Weight:=LINE_WIDTH;

                      ASheetRef.Cells[j,i].Borders[EDGE_BOTTOM].LineStyle:=LINE_STYLE;

                      ASheetRef.Cells[j,i].Borders[EDGE_BOTTOM].Weight:=LINE_WIDTH;

                      ASheetRef.Cells[j,i].Borders[EDGE_RIGHT].LineStyle:=LINE_STYLE;

                      ASheetRef.Cells[j,i].Borders[EDGE_RIGHT].Weight:=LINE_WIDTH;

                  end;

              end;

        У тебя приличную часть времени занимает доступ к ячейке таблицы, если запомнить этот адрес в переменной, то будет немного быстрее:

        ExpandedWrap disabled

          var a : OleVariant;//или какой он там?

          ..

              for i:=1 to PeriodCount + 2 do

              begin

                  for j:=1 to INIT_ROW_COUNT do

                  begin

                      a := ASheetRef.Cells[j,i];

                      a.Borders[EDGE_TOP].LineStyle:=LINE_STYLE;

                      a.Borders[EDGE_TOP].Weight:=LINE_WIDTH;

                      a.Borders[EDGE_LEFT].LineStyle:=LINE_STYLE;

                      a.Borders[EDGE_LEFT].Weight:=LINE_WIDTH;

                      a.Borders[EDGE_BOTTOM].LineStyle:=LINE_STYLE;

                      a.Borders[EDGE_BOTTOM].Weight:=LINE_WIDTH;

                      a.Borders[EDGE_RIGHT].LineStyle:=LINE_STYLE;

                      a.Borders[EDGE_RIGHT].Weight:=LINE_WIDTH;

                  end;

              end;

        Сообщение отредактировано: Jureth — 27.09.04, 04:31

        Wizard

        Bas



        Сообщ.
        #4

        ,
        27.09.04, 05:48

          Замни на FormulaR1C1 как это делает сам Excel

          ExpandedWrap disabled

            ActiveCell.FormulaR1C1 = «=VALUE(RC[-4])»


          rapido



          Сообщ.
          #5

          ,
          27.09.04, 16:52

            Full Member

            ***

            Рейтинг (т): 10

            Спасибо всем за ответы.

            Цитата anika, 26.09.04, 01:51

            По поводу второго могу порекомендовать убрать обновление экрана перед выполнением кода (_WordDoc как TWordDocument):

            _WordDoc.Application.ScreenUpdating:=false;

            а самом конце обратно соответственно в true

            Цитата Jureth, 27.09.04, 07:05

            У тебя приличную часть времени занимает доступ к ячейке таблицы, если запомнить этот адрес в переменной, то будет немного быстрее:

            Пробовал. Выигрыш незначительный.

            С формулами все равно не получается.
            При всех вариантах вылетает: OLE error 800A03EC

            ExpandedWrap disabled

                  ASheetRef.Cells[19,3]:=’=SUM(C6;C11;C14:C18)’;

                  ASheetRef.Range[‘C19:C19′].Formula:=’СУММ(C6;C11;C14:C18)’;

                  ASheetRef.Range[‘C19’, ‘C20′].Formula :=’=SUM(C6;C11;C14:C18)’;

                  ASheetRef.Cells.Item[19,3].Value:=’=SUM(C6;C11;C14:C18)’;

                  ASheetRef.Cells[19, 3].Formula:=’=SUM(C6;C11;C14:C18)’;

                  ASheetRef.Cells[19, 3].FormulaR1C1:=’=SUM(C6;C11;C14:C18)’;

            Может я чего-то недопонимаю?


            Jureth



            Сообщ.
            #6

            ,
            28.09.04, 02:31

              Цитата

              С формулами все равно не получается.

              Она скорее всего матюгается на ‘SUM’ — эту функцию она не понимает даже если её ввести руками (#ИМЯ?).

              Цитата

              Пробовал. Выигрыш незначительный.

              Тогда можно попробовать сначала сгенерировать строку из адресов ячеек для Range, а потом проставить Borders для полученного диапазона(алгоритм сейчас не дам — занят, но к вечеру или завтра — попробую). Если и это не поможет, то тогда смирись — Excel вообще штука не быстрая.


              Jureth



              Сообщ.
              #7

              ,
              28.09.04, 05:15

                Этот вариант у меня сработал:

                ExpandedWrap disabled

                  aSheetRef.Cells[19,3].FormulaLocal:=’=СУММ(C6;C11;C14:C18)’;

                Процедуры, генерирующая строку:

                ExpandedWrap disabled

                  //Вспомогательная — генерирует буквенное представление столбца по его номеру

                  function GetCol(Col: integer): String;

                  begin

                    if Col<27 then

                      Result := Chr(Col+64)

                    else

                      Result := Chr((Col div 26)+64)+ Chr((Col mod 26)+64)

                  end;

                  //Возвращает строку типа ‘A1’ для одной ячейки

                  function CellsToRange(Row1, Col1: Integer): String; overload;

                  var

                    S : String;

                  begin

                    S := GetCol(Col1)+IntToStr(Row1);

                    Result := S;

                  end;

                  //Возвращает строку типа ‘A1:C5’ для диапазона (Row1, Col1 — TopLeft угол, Row2, Col2 — RightBottom)

                  function CellsToRange(Row1, Col1, Row2, Col2: Integer): String; overload;

                  var

                    S : String;

                  begin

                    S := GetCol(Col1)+IntToStr(Row1)+’:’+ GetCol(Col2)+ IntToStr(Row2);

                    Result := S;

                  end;

                юзается это примерно так:

                ExpandedWrap disabled

                    Sheet.Range[CellsToRange(1,1,15,15)].Borders[11].Weight := 2;

                    Sheet.Range[CellsToRange(1,1,15,15)].Borders[11].LineStyle := 4

                Пока всё.


                rapido



                Сообщ.
                #8

                ,
                28.09.04, 22:29

                  Full Member

                  ***

                  Рейтинг (т): 10

                  Ураааааа! Работает!
                  Сделал так:

                  ExpandedWrap disabled

                    procedure DrawCellBorders(var ASheetRef: Variant);

                    const

                        EDGE_LEFT      = 7;

                        EDGE_TOP       = 8;

                        EDGE_BOTTOM    = 9;

                        EDGE_RIGHT     = 10;

                        INNER_VERTICAL = 11;

                        INNER_HOR      = 12;

                        LINE_STYLE     = 1;

                        LINE_WIDTH     = 2;

                    begin

                        ASheetRef.Range[CellsToRange(1,1,86,PeriodCount + 2)].Borders[INNER_VERTICAL].Weight:=LINE_WIDTH;

                        ASheetRef.Range[CellsToRange(1,1,86,PeriodCount + 2)].Borders[INNER_VERTICAL].LineStyle:=LINE_STYLE;

                        ASheetRef.Range[CellsToRange(1,1,86,PeriodCount + 2)].Borders[INNER_HOR].Weight:=LINE_WIDTH;

                        ASheetRef.Range[CellsToRange(1,1,86,PeriodCount + 2)].Borders[INNER_HOR].LineStyle:=LINE_STYLE;

                        ASheetRef.Range[CellsToRange(1,1,86,PeriodCount + 2)].Borders[EDGE_TOP].Weight:=LINE_WIDTH;

                        ASheetRef.Range[CellsToRange(1,1,86,PeriodCount + 2)].Borders[EDGE_BOTTOM].LineStyle:=LINE_STYLE;

                        ASheetRef.Range[CellsToRange(1,1,86,PeriodCount + 2)].Borders[EDGE_LEFT].Weight:=LINE_WIDTH;

                        ASheetRef.Range[CellsToRange(1,1,86,PeriodCount + 2)].Borders[EDGE_RIGHT].LineStyle:=LINE_STYLE;

                    end;//DrawCellBorders

                  Прорисовывает почти мгновенно. Спасибо Jureth.

                  Формула тоже вставляется. Только есть небольшая проблема.
                  Как обновить значение в ячейке с автосумой? А то в ней прописывает 0. А у меня в сумируемых ячейках уже есть значения и их то и надо просумировать и показать пользователю.


                  Jureth



                  Сообщ.
                  #9

                  ,
                  29.09.04, 02:09

                    Попробуй Sheet.Calculate (или Range.Calculate) — он должен форсировать пересчет данных, но я не проверял.


                    rapido



                    Сообщ.
                    #10

                    ,
                    01.10.04, 13:44

                      Full Member

                      ***

                      Рейтинг (т): 10

                      Цитата Jureth, 29.09.04, 05:09

                      Попробуй Sheet.Calculate (или Range.Calculate) — он должен форсировать пересчет данных, но я не проверял.

                      Работает.

                      И еще два вопроса.
                      1. Как установить формат ячеек, то есть:

                      ExpandedWrap disabled

                        ASheetRef.Range[‘A1:A86′].NumberFormat:=’# ###0.0’;

                      2. И как присвоить имя книге:

                      ExpandedWrap disabled

                            ExcelApp:=CreateOleObject(‘Excel.Application’);

                            ExcelApp.Visible:=true;

                            WBRef:=ExcelApp.Workbooks.Add;

                            WBRef.Name:=’Some name’;

                      Вылетает ошибка и в первом и во втором случае. Искал в инете — ничего толкового не могу найти. У меня нету этой чертовой справки ВБ.


                      Jureth



                      Сообщ.
                      #11

                      ,
                      04.10.04, 02:46

                        1. Не знаю — не делал.
                        2. Это свойство — ReadOnly, установить его можно только при сохранении книги (WBRef.SaveAs)

                        Цитата

                        У меня нету этой чертовой справки ВБ

                        Переустановил бы Офис — ради разработки приложения можно и попотеть немного.


                        rapido



                        Сообщ.
                        #12

                        ,
                        04.10.04, 14:53

                          Full Member

                          ***

                          Рейтинг (т): 10

                          Понял. Еще раз спасибо.

                          Guru

                          Miscђka



                          Сообщ.
                          #13

                          ,
                          05.10.04, 02:12

                            Цитата Jureth, 4.10.04, 08:46

                            Переустановил бы Офис — ради разработки приложения можно и попотеть немного.

                            офис можно и доустановить, не удаляя его полностью :)


                            rapido



                            Сообщ.
                            #14

                            ,
                            06.10.04, 11:58

                              Full Member

                              ***

                              Рейтинг (т): 10

                              Вот так работает:

                              ExpandedWrap disabled

                                ASheetRef.Range[CellsToRange(5,3,45,PeriodCount + 2)].NumberFormat:=’# ###,0;(# ###,0);0,0′;

                                ASheetRef.Range[CellsToRange(50,3,86,PeriodCount + 2)].NumberFormat:=’# ###,0;(# ###,0);0,0′;

                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                              0 пользователей:

                              • Предыдущая тема
                              • Delphi: Общие вопросы
                              • Следующая тема

                              [ Script execution time: 0,0500 ]   [ 16 queries used ]   [ Generated: 15.04.23, 15:09 GMT ]  

                              Для работы с Excel в Delphi, первым делом нужно в Uses указать модуль ComObj.

                              procedure TForm1.Button1Click(Sender: TObject);

                              var

                              XL: Variant;

                              begin

                              XL := CreateOLEObject(‘Excel.Application’); // Создание OLE объекта

                              XL.WorkBooks.add; // Создание новой рабочей книги

                              XL.visible := true;

                              end;

                              Как обратиться к отдельным ячейкам листа Excel в Delphi

                              XL.WorkBooks[1].WorkSheets[1].Cells[1,1].Value:=’30’;

                              //Результатом является присвоение ячейке [1,1] первого листа значения 30. Также к ячейке

                              //текущего листа можно обратиться следующим образом:

                              XL.Cells[1, 1]:=’30’;

                              Как добавить формулу в ячейку листа Excel в Delphi

                              XL.WorkBooks[1].WorkSheets[1].Cells[3,3].Value := ‘=SUM(B1:B2)’;

                              Форматирование текста в ячейках Excel, производится с помощью свойств Font и Interior объекта Cell:

                              // Цвет заливки

                              XL.WorkBooks[1].WorkSheets[1].Cells[1,1].Interior.Color := clYellow;

                              // Цвет шрифта

                              XL.WorkBooks[1].WorkSheets[1].Cells[1,1].Font.Color := clRed;

                              XL.WorkBooks[1].WorkSheets[1].Cells[1,1].Font.Name := ‘Courier’;

                              XL.WorkBooks[1].WorkSheets[1].Cells[1,1].Font.Size := 16;

                              XL.WorkBooks[1].WorkSheets[1].Cells[1,1].Font.Bold := True;

                              Работа с прямоугольными областями ячеек, с помощью объекта Range:

                              XL.WorkBooks[1].WorkSheets[1].Range[‘A1:C5’].Value := ‘Blue text’;

                              XL.WorkBooks[1].WorkSheets[1].Range[‘A1:C5’].Font.Color := clBlue;

                              //В результате в области A1:C5 все ячейки заполняются текстом ‘Blue text’.

                              Как выделить группу (область) ячеек Excel в Delphi

                              XL.Range[‘A1:C10’].Select;

                              Как установить объединение ячеек, перенос по словам, и горизонтальное или вертикальное выравнивание Excel в Delphi

                              1

                              2

                              3

                              4

                              5

                              6

                              7

                              8

                              9

                              10

                              11

                              12

                              13

                              14

                              15

                              16

                              17

                              18

                              19

                              20

                              //Выделяем группу (область) ячеек

                              XL.Range[‘A1:C10’].Select;

                              // объединение ячеек

                              XL.Selection.MergeCells:=True;

                              // перенос по словам

                              XL.Selection.WrapText:=True;

                              // горизонтальное выравнивание

                              XL.Selection.HorizontalAlignment:=3;

                              //вериткальное выравнивание

                              XL.Selection.VerticalAlignment:=1;

                              //Возможны следующие значения:

                              //1 — выравнивание по умолчанию,

                              //2 — выравнивание слева,

                              //3 — выравнивание по центру,

                              //4 — выравнивание справа.

                              Как задать границы ячеек Excel в Delphi

                              XL.Selection.Borders.LineStyle:=1;

                              // значение может быть установлено от 1 до 10

                              Как выровнять столбцы Excel по ширине, в зависимости от содержания

                              XL.selection.Columns.AutoFit;

                              Как удалить столбец Excel в Delphi

                              Как задать формат ячеек Excel в Delphi

                              XL.columns[1].NumberFormat := ‘@’; // текстовый формат

                              XL.columns[1].NumberFormat := ‘m/d/yyyy’; //  формат дата

                              XL.columns[1].NumberFormat = ‘0.00%’ // формат процентный

                              XL.columns[1].NumberFormat = ‘h:mm;@’// формат время


                              От:

                              A7exander

                               
                              Дата:  18.10.05 11:33
                              Оценка:

                              формула в ячейку Excel помещается так:

                              var
                                Range, Sheet, Excel, v: Variant;
                                  
                              begin
                                Excel := CreateOleObject('Excel.Application');
                                Sheet := Excel.Workbooks[1].Sheets[1];
                                Sheet.Cells[i, j] := '=(2+2)';                    // занесение формулы
                                Sheet.Cells[i, j] := '=СУММ(A1:A8)';        // занесение формулы
                                Excel.Visible := true;
                              end;

                              вопрос в том, как заставить Excel ее вычислить, потому как вместо результата в ячейке светится #ИМЯ? и подсказка «формула содержит нераспознанный текст» и если после этого установить курсор на строку с форулой и просто нажать Enter то формула прекрасно вычисляется… Как сделать то же самое программным методом?
                              причем строка «=(2+2)» вычисляется нормально.
                              насколько я понял распознать оно не может слово «СУММ».
                              также пытался делать нечто вроде

                                Sheet.Cells[y, i].Calculate;

                              но это ничего не меняет…

                              … << RSDN@Home 1.1.4 stable SR1 rev. 568>>


                              Re: передать формулу в Excel

                              От:

                              Horror_Infinity

                              Россия

                               
                              Дата:  18.10.05 12:07
                              Оценка:

                              Здравствуйте, A7exander, Вы писали:

                              A>формула в ячейку Excel помещается так:

                              A>

                              A>var
                              A>  Range, Sheet, Excel, v: Variant;
                                  
                              A>begin
                              A>  Excel := CreateOleObject('Excel.Application');
                              A>  Sheet := Excel.Workbooks[1].Sheets[1];
                              A>  Sheet.Cells[i, j] := '=(2+2)';                    // занесение формулы
                              A>  Sheet.Cells[i, j] := '=СУММ(A1:A8)';        // занесение формулы
                              A>  Excel.Visible := true;
                              A>end;    
                              A>



                              A> вопрос в том, как заставить Excel ее вычислить, потому как вместо результата в ячейке светится #ИМЯ? и подсказка «формула содержит нераспознанный текст» и если после этого установить курсор на строку с форулой и просто нажать Enter то формула прекрасно вычисляется… Как сделать то же самое программным методом?

                              A> причем строка «=(2+2)» вычисляется нормально.
                              A> насколько я понял распознать оно не может слово «СУММ».
                              A> также пытался делать нечто вроде
                              A>

                              A>  Sheet.Cells[y, i].Calculate;    
                              A>


                              A>но это ничего не меняет…

                              Правильно будет написать вот так:

                              Sheet.Cells[i, j] := '=SUMM(A1:A8)';        // занесение формулы

                              Имена формул надо писать по-английски. И будет тебе счастье. Причем, неважно — русский или аглицкий ексель у тебя стоит.

                              … << RSDN@Home 1.1.4 stable SR1 rev. 568>>

                              http://nick-name.ru/img.php?nick=LuciferArh&sert=2]


                              Re: передать формулу в Excel

                              От:

                              Danchik

                              Украина

                               
                              Дата:  18.10.05 12:13
                              Оценка:

                              Здравствуйте, A7exander, Вы писали:

                              Попробуй написать так:

                              Sheet.Cells[i, j].Formula := '=SUMM(A1:A8)';        // занесение формулы


                              Re[2]: передать формулу в Excel

                              От:

                              A7exander

                               
                              Дата:  18.10.05 12:34
                              Оценка:

                              Здравствуйте, Horror_Infinity, Вы писали:

                              H_I>Правильно будет написать вот так:

                              H_I>

                              H_I>Sheet.Cells[i, j] := '=SUMM(A1:A8)';        // занесение формулы
                              H_I>


                              H_I>Имена формул надо писать по-английски. И будет тебе счастье. Причем, неважно — русский или аглицкий ексель у тебя стоит.

                              Спасибо за отклик, попробовал, но в результате тот же «#ИМЯ?» вместо результата, та же подсказка, но вдобавок теперь если установить курсор на строку с формулой в ячейке и нажать Enter то ничего не меняется, тоесть похоже «SUMM» эксель не понимает впринципе… Может где то переключить что нибудь нужно, чтоб англоязычные функции понимал? Эксель из пакета «OFFICE 2003»

                              … << RSDN@Home 1.1.4 stable SR1 rev. 568>>


                              Re[2]: передать формулу в Excel

                              От:

                              A7exander

                               
                              Дата:  18.10.05 12:41
                              Оценка:

                              Здравствуйте, Danchik, Вы писали:

                              D>Попробуй написать так:

                              D>

                              D>Sheet.Cells[i, j].Formula := '=SUMM(A1:A8)';        // занесение формулы
                              D>

                              Как я уже отвечал Horror_Infinity, применение «SUMM» ничего не дает, и Excel понимает только «СУММА»… Применение «.Formula» к сожалению таже ничего не меняет.

                              … << RSDN@Home 1.1.4 stable SR1 rev. 568>>


                              Re[3]: передать формулу в Excel

                              От:

                              Horror_Infinity

                              Россия

                               
                              Дата:  18.10.05 12:51
                              Оценка:

                              Здравствуйте, A7exander, Вы писали:

                              H_I>>

                              H_I>>Sheet.Cells[i, j] := '=SUMM(A1:A8)';        // занесение формулы
                              H_I>>


                              A>Спасибо за отклик, попробовал, но в результате тот же «#ИМЯ?» вместо результата, та же подсказка, но вдобавок теперь если установить курсор на строку с формулой в ячейке и нажать Enter то ничего не меняется, тоесть похоже «SUMM» эксель не понимает впринципе… Может где то переключить что нибудь нужно, чтоб англоязычные функции понимал? Эксель из пакета «OFFICE 2003»

                              Сорри за опечатку!
                              Конечно же, надо написать вот так:

                              Sheet.Cells[i, j] := '=SUM(A1:A8)';        // занесение формулы

                              З.Ы. На будущее. Очень легко подсмотреть, как правильно писать формулы: Включаешь запись макроса в Екселе, пишешь нужную тебе формулу, останавливаешь запись, идешь в редактор макросов и смотришь, как надо тебе в дельфе написать, чтоб все работало.

                              … << RSDN@Home 1.1.4 stable SR1 rev. 568>>

                              http://nick-name.ru/img.php?nick=LuciferArh&sert=2]


                              Re: передать формулу в Excel

                              От:

                              Dimonka

                              Верблюд

                               
                              Дата:  18.10.05 12:59
                              Оценка:


                              Re[4]: передать формулу в Excel

                              От:

                              A7exander

                               
                              Дата:  18.10.05 13:17
                              Оценка:

                              Здравствуйте, Horror_Infinity, Вы писали:

                              H_I>Сорри за опечатку!

                              H_I>Конечно же, надо написать вот так:
                              H_I>

                              H_I>Sheet.Cells[i, j] := '=SUM(A1:A8)';        // занесение формулы
                              H_I>



                              H_I>З.Ы. На будущее. Очень легко подсмотреть, как правильно писать формулы: Включаешь запись макроса в Екселе, пишешь нужную тебе формулу, останавливаешь запись, идешь в редактор макросов и смотришь, как надо тебе в дельфе написать, чтоб все работало.

                              Спасибо, SUM сработало, причем если SUM набирать в формуле вручную то Excel ее не понимает, что меня и сбило с толку, однако при программном занесении в ячейку конвертирует в «СУММ» и нормально вычисляет.

                              … << RSDN@Home 1.1.4 stable SR1 rev. 568>>


                              Re[2]: передать формулу в Excel

                              От:

                              A7exander

                               
                              Дата:  18.10.05 13:17
                              Оценка:

                              Здравствуйте, Dimonka, Вы писали:

                              D>Тут отвечали на похожий вопрос:

                              D>http://rsdn.ru/Forum/?mid=1353352&amp;flat=0

                              Автор: wildwind
                              Дата: 30.08.05

                              Спасибо, применение «SUM» помогло

                              … << RSDN@Home 1.1.4 stable SR1 rev. 568>>


                              Re[3]: передать формулу в Excel

                              От:

                              NRiS

                              Россия

                               
                              Дата:  18.10.05 17:14
                              Оценка:

                              что бы эксель понимал формулы с кирилическими символами вроде СУММ нодо писать так

                              Sheet.Cells[i, j].FormulaLocal := '=СУММ(A1:A8)'

                              ICQ 349086699


                              Re[4]: передать формулу в Excel

                              От:

                              Horror_Infinity

                              Россия

                               
                              Дата:  19.10.05 04:40
                              Оценка:

                              Здравствуйте, NRiS, Вы писали:

                              NRS>что бы эксель понимал формулы с кирилическими символами вроде СУММ нодо писать так

                              NRS>

                              NRS>Sheet.Cells[i, j].FormulaLocal := '=СУММ(A1:A8)'
                              NRS>

                              Тогда английский ексель перестает понимать такие формулы. Как быть? У меня (да и не только у меня) стоит именно оригинальная английская версия.

                              … << RSDN@Home 1.1.4 stable SR1 rev. 568>>

                              http://nick-name.ru/img.php?nick=LuciferArh&sert=2]

                              Подождите ...

                              Wait...

                              • Переместить
                              • Удалить
                              • Выделить ветку

                              Пока на собственное сообщение не было ответов, его можно удалить.

                               
                              EgorT
                               
                              (2004-01-08 12:24)
                              [0]

                              Добрцый день! Есть такая проблема: хочется из Delphi 5 записывать в MS Excel всякие разные формулы, отличные от SUM. Помогите кто знает как это делать!


                               
                              Романов Р.В.
                               
                              (2004-01-08 12:25)
                              [1]

                              cells.Formula := «=МИН(A1:A10)»;


                               
                              REP
                               
                              (2004-01-08 12:31)
                              [2]

                              cells.Formula := «=MIN(A1:A10)»; Вроде как русские формулы он не понимает. Хотя может и от версии зависит.


                               
                              EgorT
                               
                              (2004-01-08 12:34)
                              [3]

                              Не помогает пишет «#ИМЯ?» в той ячейке, то есть результат считать не могу, или если записть формулу «=ЕСЛИ(A1=10;A2+A3;0)» тоже ничего хорошего не получилось


                               
                              EgorT
                               
                              (2004-01-08 12:35)
                              [4]

                              например Сумм понимает замечательно а все остальное нет


                               
                              Романов Р.В.
                               
                              (2004-01-08 13:00)
                              [5]

                              A1 пиши на английской раскладке


                               
                              REP
                               
                              (2004-01-08 13:06)
                              [6]

                              Вместо точки с запятой используй ЗАПЯТУЮ

                              А в сумм ты не используешь точку с запятой

                              Типа:

                              «=ЕСЛИ(A1=10
                              , A2+A3,0)»


                               
                              EgorT
                               
                              (2004-01-08 13:10)
                              [7]

                              А1 пишу по английски, а на счет запятой попробую


                               
                              Карелин Артем
                               
                              (2004-01-08 13:26)
                              [8]

                              Делай макрос и формулу бери из макроса. К примеру
                              =ЕСЛИ(H8=12;G3;12) на самом деле будет
                              "=IF(R[7]C[7]=12,R[2]C[6],12)"


                               
                              EgorT
                               
                              (2004-01-08 13:39)
                              [9]

                              А если данный файлик каждый раз новый будет макрос к чему прицеплять, и все формулы туда записывать, или я чего то не понял


                               
                              REP
                               
                              (2004-01-08 13:45)
                              [10]

                              Карелин Артем © (08.01.04 13:26) [8]

                              Ну не обязательно уж прямо R[7]C[7] Можно и обычно использовать H8, однако с синтаксисом нужно быть поосторожнее. Можно в Екселе находить нужную формулу по русски, а затем в «смотри также»(See also) находить ее англоязычный синтаксис


                               
                              Карелин Артем
                               
                              (2004-01-08 13:52)
                              [11]

                              REP © (08.01.04 13:45) [10]

                              Не обязательно. Это я через запись макроса получил.

                              EgorT (08.01.04 13:39) [9]

                              Именно не понял идею. Через макрос Названия формул надо получать. Хранить из не надо.


                               
                              REP
                               
                              (2004-01-08 14:03)
                              [12]

                              Карелин Артем © (08.01.04 13:52) [11]

                              Сидим и говорим друг другу «не обязательно, не обязательно»

                              Все таки нагляднее H8 (роднее для тех кто ексель знает немного)

                              А так пиши как угодно, не спорю.

                              :))

                              EgorT (08.01.04 13:39) [9]

                              А идея рассмотрена в соседней ветке:

                              http://delphimaster.net/view/1-1073549258/

                              По сути однотипные вопросы-то. И решение проблемы одно…


                              уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

                              Сегодняшняя статья блога  будет целиком посвящена работе с Excel Range или, говоря другими словами — работе с диапазонами ячеек Excel.

                              Про работу с этими объектами я уже вкратце говорил, а сегодня хотел бы поделиться с вами более полной информацией. Итак, начнем с самого простого.

                              1. Что такое Range и как его получить?

                              Согласно официальному определению Microsoft, Range :

                              представляет собой ячейки, строки, столбцы, набор ячеек, содержащих один или более смежных блоков ячеек, или 3-D диапазон.

                              Однако это определение не исключает того, что объектом Range может выступать и одна ячейка (Cell) листа.  Таким образом, чтобы получить в свое распоряжение объект Range, можно выполнить следующие операции c объектом Excel в Delphi:

                              var  MyRange: OLEVariat;
                              begin
                              {объект Range, состоящий из одной ячейки}
                                MyRange:=MyExcel.ActiveWorkBook.ActiveSheet.Range['A1'];
                              {объект Range в виде строки из четырех ячеек}
                                MyRange:=MyExcel.ActiveWorkBook.ActiveSheet.Range['A1:D1'];
                              {объект Range в виде столбца из четырех ячеек}
                                MyRange:=MyExcel.ActiveWorkBook.ActiveSheet.Range['A1:A4'];
                              {объект Range в виде таблицы 4х4 ячейки}
                                MyRange:=MyExcel.ActiveWorkBook.ActiveSheet.Range['A1:D4'];
                              end;

                              Если Вам неудобно в какой-либо ситуации использовать буквенные обозначение ячеек или Вы привыкли до этого момента иметь дело только с отдельными ячейками (Cells), то объект Range можно получить например вот так:

                              var  MyRange: OLEVariat;
                                   Cell_1, Cell2: OLEVariant;
                              begin
                              {получаем ссылку на объект Cells, соответствующей ячейке A1}
                                Cell_1:=MyExcel.ActiveWorkBook.ActiveSheet.Cells[1,1];
                              {получаем ссылку на объект Cells, соответствующей ячейке C5}
                                Cell_2:=MyExcel.ActiveWorkBook.ActiveSheet.Cells[5,3];
                              {получаем объект Range размером 3х5}
                                MyRange:=MyExcel.ActiveWorkBook.ActiveSheet.Range[Cell_1, Cell_2]
                              end;

                              Какой из способов Вы будете использовать в Delphi — не важно, так как результат будет один и тот же. Получив в свое распоряжение диапазон Вы можете использовать его далее, например, для того, чтобы установить вид его границ.

                              2. Свойства объекта Excel Range.

                              Рассмотрим основные свойства объекта Range и их применение работе в Excel в Delphi.

                              Вначале перечислю свойства, которые будут далее рассмотрены в статье.

                              Свойство Описание
                              Formula Возвращает или помещает в диапазон формулу
                              Value Возвращает или устанавливает значение для диапазона
                              Text возвращает текст из ячейки
                              Column Возвращает номер первого столбца в первой области, в указанном диапазоне
                              Columns возвращает объект Range, представляющий собой один столбец из всего диапазона
                              Comment Возвращает объект Comment для Range. В данном случае Range должен определять одну ячейку.
                              Address Возвращает реальный адрес диапазона Range

                              Formula

                              Возвращает или помещает в диапазон формулу.

                              Value

                              Возвращает или устанавливает значение для диапазона.Свойство Value замечательно тем, что с помощью него можно записать в ячейки абсолютно любые данные, особо не задумываясь о формате данных. Например, запишем в ячейки диапазона строку, число типа integer и число типа single: чтобы каждый раз не повторяться в листингах и не писать одни и те же элементы по 100 раз, будем считать, что в переменной Sheet уже содержится ссылка на активный лист (ActiveWorkSheet) активной книги (ActiveWorkBook) Excel (MyExcel)

                              var i:integer;
                                  s: single;
                                  str: string;
                                  Sheet: OLEVariant;
                              begin
                                i:=100;
                                s:=2.12;
                                str:='Hello World!';
                                Sheet.Range['A1'].Value:=i;
                                Sheet.Range['A2'].Value:=s;
                                Sheet.Range['A3'].Value:=str;
                              end;

                              Как видите, обращение к ячейкам было одно и то же и нигде я не приводил данный к какому-то типу — записал в ячейки всё как есть.

                              Если Вы хотите записать в весь диапазон Range одно и то же значение, то просто выполните:

                              Sheet.Range['A1:A10'].Value:=str;

                              и получите одну и ту же строку «Hello World!» в десяти ячейках Excel, но такие операции очень редко необходимы при работе с Excel в Delphi. Зато очень часто необходимо воспользоваться другой стороной свойства Value — прочитать большой объем данных из книги Excel за один прием и получить весь массив данных в Delphi. Операция чтения данных из Excel в Delphi более проста, чем Вам может показаться на первый взгляд. Проведем обратную операцию — прочитаем данные из Excel:

                              var  val: Variant;
                                   Sheet: OLEVariant;
                                   i:integer;
                              begin
                                Val:=Sheet.Range['A1:A3'].Value;
                                for i:=1 to 3 do
                                  ShowMessage(val[i,1]);
                              end;

                              Если Вам необходимо читать/писать большое количество данных, то наиболее быстрым способом работы с данными будет использование вариантных массивов. О том, как использовать вариантные массивы при работе с Excel в Delphi рассказывается в статье «Быстрая обработка данных Excel в Delphi.«

                              Как видите здесь мы за один прием прочитали данные сразу из трех ячеек Excel и отобразили их в сообщении. Этот прием чтения на порядок более скоростной, чем, например чтение содержимого каждой ячейки (Cells) в отдельности.

                              Text

                              Ещё одно простенькое свойство объекта Range — возвращает текст из ячейки. Самое главное отличие от свойства Value Text возвращает string только для чтения и использовать это свойство для чтения большого объема данных, как в предыдущем примере — ни в коем случае нельзя, так как переменная Val вернет значение Null.

                              Column

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

                              Чтобы продемонстрировать свойство в действии, давайте создадим такие диапазоны как показано на рисунке:

                              Excel_RangeТо есть каждый из диапазонов Range будет содержать по две несвязанные друг с другом области (Area). Причем первая область диапазона Range будет начинаться в столбце А, а первая область второго диапазона (Range 2) — в столбце B.

                              После того, как диапазоны будут созданы — посмотрим, что вернет нам свойство Column для каждого из диапазонов.

                              Листинг процедуры создания двух несвязных диапазонов Range следующий:

                              var Range1,Range2,BigRange: OLEVariant;
                              begin
                              {создаем первый диапазон}
                                Range1:=Sheet.Range['A1:C4'];
                                Range2:=Sheet.Range['E6:H9'];
                                BigRange:=Sheet.Range[Range1,Range2];
                                ShowMessage(IntToStr(BigRange.Column)); //показываем значение свойства
                              {создаем второй диапазон}
                                Range1:=Sheet.Range['B7:C13'];
                                Range2:=Sheet.Range['E1:H3'];
                                BigRange:=Sheet.Range[Range1,Range2];
                                ShowMessage(IntToStr(BigRange.Column)); //показываем значение свойства
                              end;

                              Так, в случае с первым Range Column вернет нам значение 1, а для второго Range — значение 2.

                              Columns

                              В отличие от предыдущего свойства, Columns возвращает не простое число, а объект Range, представляющий собой один столбец из всего диапазона.

                              Посмотрим как, например, используя это свойство можно изменять столбцы во всем диапазоне Range.

                              Для демонстрации воспользуемся предыдущим примером, изменим только окончание:

                              ...
                              BigRange:=Sheet.Range[Range1,Range2];
                              for i:=1 to BigRange.Columns.Count do
                                BigRange.Columns[i].Value:='Столбец №'+IntToStr(i);

                              Excel_Range_ColumnsВ итоге в каждый из столбцов диапазона должна записаться строка с номером этого столбца, результат представлен на рисунке. Как видите, в цикле все столбцы обработались «насквозь», хотя Range не содержал в себе столбец D.

                              Возвращает объект Comment для Range. В данном случае Range должен определять одну ячейку.

                              Для демонстрации свойства не будем заходить в Excel, поработаем с приложением прямо из Delphi. Для этого воспользуемся методом AddComment. То есть сначала запишем комментарий в ячейку, а потом прочитаем его используя свойство Comment:

                              Range2:=Sheet.Range['E6'];
                              {записали комментарий}
                              Range2.AddComment('Это комментарий ячейки области');
                              {прочитали}
                              ShowMessage(Range2.Comment.Text);

                              Address

                              Возвращает реальный адрес диапазона Range. Например для диапазона ячеек, заданных вот таким образом:

                              Range2:=Sheet.Range['A1:E6'];
                              Свойство Address будет содержать строку "$A$1:$E$6"

                              Это свойство удобно использовать, когда Вы оперируете в программе только числовыми значениями (номерами столбцов и строк) и появляется необходимость показать пользователю адреса ячеек из диапазона.

                              Помимо перечисленных выше свойств к объекту Range применимы все свойства, описанный в статье об изменении внешнего вида ячеек Excel, т.е. borders, color и пр.

                              3. Методы объекта Excel Range.

                              Теперь рассмотрим несколько полезных методов, которые могут Вам пригодиться при работе с Excel в Delphi.

                              Метод Описание
                              CheckSpelling Проверяет грамматику в выбранном диапазоне и при нахождении ошибок выводит окно для замены
                              PrintPreview Выводит на экран окно предварительного просмотра перед печатью выбранного диапазона ячеек
                              AutoFill Автозаполнение диапазона ячеек на основе данных из другого диапазона
                              AutoFit Изменяет ширину или высоту ячеек диапазона для наилучшего представления данных.
                              Clear Удаляет все данные из диапазона
                              ClearComments Удаляет все комментарии в диапазоне Range
                              ClearContents Удаляет все формулы из диапазона Range
                              ClearFormats Очищает форматы в диапазоне Range
                              ClearNotes Очищает все заметки в диапазоне Range
                              Copy Копирует содержимое диапазона Range в буфер обмена или в другой диапазон
                              PasteSpecial Специальная вставка диапазона
                              Cut Вырезает данные и при необходимости вставляет их в новый диапазон
                              Merge Объединение ячеек диапазона

                              CheckSpelling

                              Проверяет грамматику в выбранном диапазоне и при нахождении ошибок выводит окно для замены. Замечательной особенностью этого метода является то, что окно замены появляется даже при скрытом окне Excel, то есть, когда свойство Visible у объекта Excel равно false.

                              Вызывается метод без каких-либо дополнительных параметров:

                              Range['A1:H6'].CheckSpelling

                              PrintPreview

                              Выводит на экран окно предварительного просмотра перед печатью выбранного диапазона ячеек. Также как и предыдущий метод PrintPreview не имеет дополнительных параметров. Однако при попытке вызвать метод при скрытом окне Excel в лучшем случае возникнет исключительная ситуация, в худшем — зависание Вашего приложения. Так что перед вызовом:

                              не забывайте включить свойство Visible у Excel:

                              AutoFill

                              Автоматическое заполнение диапазона ячеек на основе данных из другого диапазона.

                              Вызов метода:

                              Range.AutoFill(Destination, Type)
                              Параметр Тип Описание
                              Destination Variant представляет собой объект Range уже заполненных ячеек. Эти ячейки должны входить в автозаполняемый диапазон
                              Type Integer тип автозаполнения (возможные значения см. ниже)

                              Рассмотрим применение метода на примере.

                              Sheet.Range['A1'].Value:=1;
                              Sheet.Range['A2'].Value:=2;
                              Source:=Sheet.Range['A1:A6'];
                              Range2:=Sheet.Range['A1:E6'];
                              Source.AutoFill(Range2, xlFillDefault)

                              В результате лист Excel примет следующий вид:

                              Excel_Range_AutoFillКак видите все столбцы второго диапазона Range заполнились значениями из диапазоны Source.

                              При использовании этого метода следует иметь в виду, что диапазон-источник (в нашем случае — это source) по одному из измерений должен совпадать с источником назначения. В приведенном примере совпадает размерность по строкам (в обоих диапазонах их шесть). Если размерности диапазонов не совпадают, то возникает исключительная ситуация.

                              При использовании метода мы использовали одну из констант в параметре Type xlFillDefault = 0. Используя её мы скопировали данные один-к-одному. Дополнительно Вы можете использовать следующие константы при автозаполнении:

                              Имя Значение Описание
                              xlFillDefault 0 скопировать данные один-к-одному
                              xlFillDays 5 копирование дней недели с расширением, т.е., если Вы запишете в ячейку слово «Понедельник» и попробуете провести автозаполнение ещё на 2 строки, то во второй и третьей строке появятся «Вторник» и «Среда»
                              xlFillCopy 1 копирует все данные и форматы, повторяя при необходимости
                              xlFillFormats 3 копирует только форматы источника
                              xlFillMonths 7 копирует названия месяцев. Работает аналогично xlFillDays
                              xlFillSeries 2 копирует данные с расширением, например 1,2,3 будут при копировании расширены до 4,5,6 и т.д. Также копирует форматы данных
                              xlFillValues 4 копирует только значения
                              xlFillWeekdays 6 копирует дни рабочей недели, работает аналогично xlFillDays, но только до пятницы
                              xlFillYears 8 копирует года. Работает аналогично xlFillDays
                              xlGrowthTrend 10 копирует числовые значения из источника, расширяя их в предположении, что каждое последующее число представляет собой предыдущее, но умноженное на некоторую величину. Например 1,2 раскопируются в 4, 8, 16 и т.д. Формат данных также копируется
                              xlLinearTrend 9 копирует числовые значения из источника, расширяя их в предположении, что каждое последующее число представляет собой предыдущее + некоторая величина. Например 1,2 раскопируются в 3, 4, 5 и т.д. Формат данных также копируется

                              AutoFit

                              Изменяет ширину или высоту ячеек диапазона для наилучшего представления данных.

                              Пример вызова:

                              Sheet.Range['A1'].Value:=1234567891012;
                              Sheet.Range['A2'].Value:=23456789;
                              Source:=Sheet.Range['A1:A2'];
                              Source.Columns.AutoFit

                              Приведет и изменению ширины столбца А таким образом, чтобы число было полностью видно на листе.

                              Методы очистки данных диапазона Range

                              Есть несколько различных методов очистки содержимого диапазона Range при работе с Excel в Delphi.

                              1. Clear

                              Удаляет все данные из диапазона.

                              Пример вызова:

                              2. ClearComments

                              Удаляет все комментарии в диапазоне Range.

                              Пример вызова:

                              3. ClearContents

                              Удаляет все формулы из диапазона Range

                              Пример вызова:

                              4. ClearFormats

                              Очищает форматы в диапазоне Range

                              Пример вызова:

                              5. ClearNotes

                              Очищает все заметки в диапазоне Range

                              Пример вызова:

                              Методы работы с буфером обмена Excel

                              1. Copy

                              Копирует содержимое диапазона Range в буфер обмена или в другой диапазон.

                              Попробуем реализовать работу метода следующим образом: заполним столбец А некоторыми значениями, а затем скопируем его сначала в буфер, а потом в столбец Е:

                              Sheet.Range['A1'].Value:=1;
                              Sheet.Range['A2'].Value:=2;
                              Sheet.Range['A3'].Value:=3;
                              Sheet.Range['A4'].Value:=4;
                              Sheet.Range['A5'].Value:=5;
                              Sheet.Range['A6'].Value:=6;
                              Source:=Sheet.Range['A1:A6'];
                              Source.Copy; //скопировали в буфер
                              Range2:=Sheet.Range['E1:E6'];
                              Source.Copy(Range2)//скопировали в новый диапазон

                              А для того, чтобы вставить данные из буфера обмена существует ещё один метод

                              2. PasteSpecial

                              Вызов метода:

                              MyRange.PasteSpecial(Paste, Operation, SkipBlanks, Transpose)
                              Параметр Тип Описание
                              Paste Integer определяет какая часть данных диапазона будет вставлена (возможные значения см. ниже)
                              Operation Integer операция, которая будет выполнена при вставке данных (возможные значения см. ниже)
                              SkipBlanks boolean True, для того чтобы пустые ячейки из буфера обмена не вставлялись в диапазон назначения. Значение по умолчанию False
                              Transpose boolean транспонирование столбцов и строк после вставки. По умолчанию устанавливается значение False

                              При определении параметра Paste следует использовать следующие константы:

                              Имя Значение Описание
                              xlPasteAll -4104 Вставка всех данных
                              xlPasteAllExceptBorders 7 Вставка всего содержимого за исключением вида границ диапазона
                              xlPasteAllUsingSourceTheme 13 Вставка всего содержимого, используя тему оформления источника
                              xlPasteColumnWidths 8 Копирует ширину столбцов
                              xlPasteComments -4144 Вставка комментариев
                              xlPasteFormats -4122 Вставка форматов данных
                              xlPasteFormulas -4123 Вставка формул
                              xlPasteFormulasAndNumberFormats 11 Вставка формул и чисел
                              xlPasteValidation 6 Вставка проверок
                              xlPasteValues -4163 Вставка значений
                              xlPasteValuesAndNumberFormats 12 Вставка значений и чисел

                              При использовании параметра Operation следует использовать следующие константы:

                              Имя Значение Описание
                              xlPasteSpecialOperationAdd 2 К скопированным данным будут добавлены значения из целевых ячеек
                              xlPasteSpecialOperationDivide 5 Скопированные данные будут разделены на значения в целевых ячейках
                              xlPasteSpecialOperationMultiply 4 Скопированные данные будут умножены на значения в целевых ячейках
                              xlPasteSpecialOperationNone -4142 При вставке значений никакие операции не будут применяться
                              xlPasteSpecialOperationSubtract 3 Из скопированных данных будут вычитаться значения целевых ячеек

                              Теперь рассмотрим применение метода на примере. В качестве исходных данных возьмем данные из предыдущего примера, но для вставки используем метод PasteSpecial:

                              ...
                              Range2.PasteSpecial(Operation:=xlPasteSpecialOperationAdd);

                              После выполнения этой операции все данные вставятся в диапазон Range2, т.к. диапазон до вставки был пуст, то данные скопировались один-к-одному.

                              3. Cut

                              Вырезает данные и при необходимости вставляет их в новый диапазон. Метод работает аналогично методу Copy, но с последующим удалением данных из источника.

                              Merge

                              Объединение ячеек диапазона.

                              Для новичков, только начинающих постигать азы работы с excel в Delphi этот метод в какой-то момент становится камнем преткновения :). Дело в том, что очень часто возникает необходимость объединить часть ячеек листа для записи в объединенную область большого количества данных или длинной строки. В Excel есть такой метод Union, который и отвечает за объединение — им-то и пробуют пользоваться многие. А метод Union при вызове из Delphi применительно к диапазону Range вызывает исключительную ситуацию. Про Merge люди либо не знают, либо забывают. А использовать его достаточно просто:

                              Параметр Тип Описание
                              Across boolean True, чтобы объединить ячейки в каждой строке указанного диапазона как отдельные объекты. Значение по умолчанию False

                              Например, объединим ячейки в диапазоне Range2 из предыдущего примера:

                              После выполнения этой операции в диапазоне останется только верхнее значение, т.е. 1.

                              Дополнительные методы автозаполнения ячеек диапазона Range

                              В отдельную группу методов можно выделить 4 метода автозаполнения ячеек диапазона:

                              1. FillDown
                              2. FillUp
                              3. FillRight
                              4. FillLeft

                              Принцип действия этих методов один и тот же за исключением направления автозаполнения.

                              Например, давайте запишем в ячейку A1 какое-нибудь значение и воспользуемся методами FillDown и FillRight:

                              Sheet.Range['A1'].Value:=1;
                              Sheet.Range['A1:A6'].FillDown;
                              Sheet.Range['A1:F1'].FillRight;

                              После этого в строк 1 и столбце A появятся числа 1. Аналогичным образом можно заполнять не только строки или столбцы, но и таблицы целиком — достаточно знать в какую сторону двигаться при автозаполнениии и применять соответствующие методы Excel для Range.

                              Вот в принципе краткий обзор возможностей работы с объектов Range в Excel. В целом можно отметить, что работа с этим объектом в Delphi один из самых эффективных способов организации пресылки/получения данных между Excel и Delphi, не считая работы через XML формат.

                              Книжная полка

                              Название:Разработка приложений Microsoft Office 2007 в Delphi

                              Описание Описаны общие подходы к программированию приложений MS Office. Даны программные методы реализации функций MS Excel, MS Word, MS Access и MS Outlook в среде Delphi.

                              купить книгу delphi на ЛитРес

                              0
                              0
                              голоса

                              Рейтинг статьи

                              уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

                              Понравилась статья? Поделить с друзьями:
                            • Как вставить формулу в ячейку excel на умножение
                            • Как вставить формулу в таблицу excel для столбца
                            • Как вставить форматированный текст в word
                            • Как вставить формулу в ячейку excel в макросе
                            • Как вставить формат pdf в excel