Delphi excel формулу ячейки

Z-7000

0 / 0 / 0

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

Сообщений: 40

1

03.07.2014, 08:20. Показов 8751. Ответов 6

Метки нет (Все метки)


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

Добрый день!
Нужна ваша помощь знатоки! )
Есть шаблон документа, я его заполняю и делаю копию. В этом документе есть несколько листов.
И нужно что одни ячейки листа А были ровны ячейкам листа В. все вроде бы просто!!!!)
Для этого использовал формулы типа:
1) =ЕСЛИ(B!AD9<>»»;B!AD9;»»)
и
2) =СЦЕПИТЬ(B!AD9)
Пришлось их, т.к. если писать просто (=B!AD9), получаю ноль, заполняемая ячейка будет пуста.
Но пошли проблемы!!! Когда копирую из шаблона листы

Delphi
1
WorkSheet1.WorkSheets[1].Copy(After:=WorkSheet2.WorkSheets[1]);



формулы теряются (((
Если пытаюсь cоpдать формулу из Delphi в Excel, используя первую формулу:

Delphi
1
WorkSheet2.WorkSheets[2].Cells[13,10].Formula:= '=ЕСЛИ(Z!AD9<>"";Z!AD9;"")';

грязно ругается!!!
Если пытаюсь cоpдать формулу из Delphi в Excel, используя вторую формулу:

Delphi
1
WorkSheet2.WorkSheets[2].Cells[13,10].Formula:= '=СЦЕПИТЬ(Z!AD9)';

не ругается. Но в ячейке стоит #ИМЯ?, нужно зайти в ячейку и нажать Enter что отработала формула.
Как победить это дело нужно чтобы при заполнении B, А становилось равно B и всего!!!



0



Mawrat

13094 / 5875 / 1706

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

Сообщений: 8,808

03.07.2014, 09:37

2

Лучший ответ Сообщение было отмечено Z-7000 как решение

Решение

Цитата
Сообщение от Z-7000
Посмотреть сообщение

Для этого использовал формулы типа:
1) =ЕСЛИ(B!AD9<>»»;B!AD9;»»)
и
2) =СЦЕПИТЬ(B!AD9)

Достаточно формулы №1.

Цитата
Сообщение от Z-7000
Посмотреть сообщение

Когда копирую из шаблона листы
WorkSheet1.WorkSheets[1].Copy(After:=WorkSheet2.WorkSheets[1]);


формулы теряются (((

Выполнение первой строки не приводит к потере формул. Значит, где-то дальше в коде формулы затираются.

Цитата
Сообщение от Z-7000
Посмотреть сообщение

Если пытаюсь cоpдать формулу из Delphi в Excel, используя первую формулу:
WorkSheet2.WorkSheets[2].Cells[13,10].Formula:= ‘=ЕСЛИ(Z!AD9<>»»;Z!AD9;»»)’;
грязно ругается!!!

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

Код

=IF(B!AD9<>"";B!AD9;"")

Цитата
Сообщение от Z-7000
Посмотреть сообщение

WorkSheet2.WorkSheets[2].Cells[13,10].Formula:= ‘=СЦЕПИТЬ(Z!AD9)’;
не ругается. Но в ячейке стоит #ИМЯ?, нужно зайти в ячейку и нажать Enter что отработала формула.

Как выше уже упоминалось — в случае программной записи формулы надо задавать в варианте для английского языка. После записи формул надо или выполнить перерасчёт отдельного листа:

Delphi
1
WorkSheetNew.Calculate;

или перерасчёт всех открытых рабочих книг — на случай, если на других листах есть формулы, связанные текущим листом:

Delphi
1
exApplication.Calculate;


В общем, надо разобраться с кодом, который идёт после строки:

Delphi
1
WorkSheet1.WorkSheets[1].Copy(After:=WorkSheet2.WorkSheets[1]);

Потому, что выполнение самой этой строки не приводит к потере формул.

Добавлено через 19 минут

Цитата
Сообщение от Mawrat
Посмотреть сообщение

После записи формул надо или выполнить перерасчёт отдельного листа:

Вернее, лучше так — если формул много, то перед их записью надо отключить режим автоматического пересчёта. А после записи всех формул, вновь включить автоматический пересчёт:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
const
  xlManual = -4135;
  xlAutomatic = -4105;
var
  exApp : OleVariant;
...
begin
...
  exApp.Calculation := xlManual; //Переключение на режим ручного пересчёта.
  //Запись формул в ячейки.
  ...
  exApp.Calculation := xlAutomatic; //Вновь включаем автоматический пересчёт.



2



Z-7000

0 / 0 / 0

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

Сообщений: 40

04.07.2014, 03:41

 [ТС]

3

Большое спасибо за такой прекрасный ответ.
Совершенно верно, что нужно писать все функции на английском языке ) я не обратил внимания.
Тут еще я допустил ошибку:

Delphi
1
=IF(B!AD9<>"";B!AD9;"")

Excel использует в формуле «;» — точку с запятой, но для Delphi это ошибка, нужна просто запятая:

Delphi
1
=IF(B!AD9<>"",B!AD9,"")

В Excel уже будет все как нужно!
И точно, копирование не удаляет формулы, это я затирал формулы в процессе заполнения листов.!!!
И получается что цифры:

Delphi
1
2
  xlManual = -4135;
  xlAutomatic = -4105;

это диапазон строк в котором происходит перерасчет?



0



Mawrat

13094 / 5875 / 1706

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

Сообщений: 8,808

04.07.2014, 08:45

4

Цитата
Сообщение от Z-7000
Посмотреть сообщение

Excel использует в формуле «;» — точку с запятой, но для Delphi это ошибка, нужна просто запятая:

Правильно. Только это не в Delphi дело. Это в Excel такая особенность записи формул через программу — что аргументы надо разделять запятой, а не точкой с запятой.

Цитата
Сообщение от Z-7000
Посмотреть сообщение

И получается что цифры:

Delphi
1
2
  xlManual = -4135;
  xlAutomatic = -4105;

это диапазон строк в котором происходит перерасчет?

Это константы, с помощью которых задаётся режим перерасчёта формул. Если мы пишем так:

Delphi
1
2
//Здесь exApp ссылается на интерфейс корневого объекта Excel - Excel.Application.
exApp.Calculation := xlAutomatic;

то включается автоматический режим перерасчёта. В этом случае каждый раз, когда мы записываем формулу в ячейку, Excel выполняет перерасчёт. Этот режим чаще всего задействован по начальным установкам.
А если мы пишем так:

Delphi
1
2
//Здесь exApp ссылается на интерфейс корневого объекта Excel - Excel.Application.
exApp.Calculation := xlManual;

то Excel не будет автоматически выполнять расчёты по формулам. Расчёт будет выполнен, только, если вызвать метод exApp.Calculate (если exWorkSheet.Calculate для пересчёта отдельного листа). Это бывает полезно, когда на листы надо записать большое количество формул — чтобы Excel во время этого процесса не выполнял перерасчёты.



0



0 / 0 / 0

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

Сообщений: 40

04.07.2014, 09:38

 [ТС]

5

Все предельно ясно )
И еще один маленький вопрос, больше относящийся к Excel.
Есть ячейка с текстом и если текст в ней подчеркнут, то другая ячейка становилась ей ровна.
что-то типа

Код

=IF(лист!N83Font.Underline=true,лист!N83,"")

а найти пример не могу (



0



13094 / 5875 / 1706

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

Сообщений: 8,808

04.07.2014, 10:38

6

Вот с этим разбираться надо — возможно ли такое сделать через формулу? А через программу сделать можно — написать код, который будет проверять свойства шрифта.



0



0 / 0 / 0

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

Сообщений: 40

04.07.2014, 11:04

 [ТС]

7

) Да через программу это легко согласен.!
Но просто программа отработала, а есть необходимость редактировать данные в Excel и только в одном листе,
а в остальных автоматом изменяются значения.
Ладно, буду думать) если у вас есть идеи пишите, буду рад.!

Еще маленький вопрос уже программный, Excel открывается нормально, но почему-то за формой программы, такое заметил с в десятом Excel. Как заставить его открываться поверх, всех окон и в развернутом виде, а не маленьким прямоугольником, что тоже бывает.!.?



0



IT_Exp

Эксперт

87844 / 49110 / 22898

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

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

04.07.2014, 11:04

7

Для работы с 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;@’// формат время


>
Вставка формулы в 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,0452 ]   [ 16 queries used ]   [ Generated: 13.04.23, 22:37 GMT ]  

                              Создание документа

                              Внимание!!! Всегда когда создаете объект интерфейса, заключайте  процедуру создания в модуль обработки ошибок:
                              try
                              создаем интерфейс;
                              формируем отчет;
                              освобождаем интерфейс;
                              Except
                              обрабатываем ошибки;
                              освобождаем интерфейс;
                              end;

                              Далее идет краткий справочник по основным функциям работы с EXCEL

                              try
                              // создаем обьект EXCEL
                              excel := CreateOleObject(‘Excel.Application’);

                              // Чтоб не задавал вопрос о сохранении документа
                              excel.DisplayAlerts := false;

                              // создаем новый документ рабочую книгу
                              excel.WorkBooks.Add;

                              // или загружаем его из директории с программой
                              excel.WorkBooks.Open(GetCurrentDir() + ‘отчет.xls’);

                              { GetCurrentDir()- возвращает путь к директории с программой}

                              // Делаем его видимым данную функцию после отладки и тестирования лучше использовать в конце, после сформирования отчета (это ускоряет процесс вывода данных в отчет)
                              excel.Visible := true;

                              //задаем тип формул в формате R1C1
                              excel.Application.ReferenceStyle := xlR1C1;

                              // задаем тип формул в формате A1
                              excel.Application.ReferenceStyle := xlA1;

                              // Задаем название первому и второму листу
                              excel.WorkBooks[1].WorkSheets[1].Name := ‘Отчет1’;
                              excel.WorkBooks[1].WorkSheets[2].Name := ‘Отчет2’;

                              //задаем формат числа для первой и четвертой колонки формат числа
                              excel.WorkBooks[1].WorkSheets[1].Columns[1].NumberFormat := ‘0,00’;
                              excel.WorkBooks[1].WorkSheets[1].Columns[4].NumberFormat := ‘0,0’;

                              // задаем ширину первой и второй колонки
                              excel.WorkBooks[1].WorkSheets[1].Columns[1].ColumnWidth := 10;
                              excel.WorkBooks[1].WorkSheets[1].Columns[2].ColumnWidth := 20;

                              // задаем начертание, цвет, размер и тип шрифта для первого ряда
                              excel.WorkBooks[1].WorkSheets[1].Rows[1].Font.Bold := True; //жирный
                              excel.WorkBooks[1].WorkSheets[1].Rows[1].Font.Color := clRed;  // цвет красный
                              excel.WorkBooks[1].WorkSheets[1].Rows[1].Font.Size := 12;  //размер 12
                              excel.WorkBooks[1].WorkSheets[1].Rows[1].Font.Name := ‘Times New Roman’;  //шрифт

                              //присваиваем ячейке 1,4 и 2,4 значения (1 — ряд, 4 — колонка)
                              excel.WorkBooks[1].WorkSheets[1].Cells[1, 4] := ‘А так можно внести значение в ячейку’;
                              excel.WorkBooks[1].WorkSheets[1].Cells[2, 4] := ‘А так можно внести значение в ячейку’;

                              //ввод в ячейку ‘A12’ формулы ‘=b5+c4’
                              excel.WorkBooks[1].WorkSheets[1].Range[‘A12′].Formula:=’=b5+c4’;

                              // Выравнивам первый ряд по центру по вертикали
                              excel.WorkBooks[1].WorkSheets[1].Rows[1].VerticalAlignment := xlCenter;

                              // Выравнивам первый ряд по центру по горизонтали
                              excel.WorkBooks[1].WorkSheets[1].Rows[1].HorizontalAlignment := xlCenter;

                              // Выравнивам в ячейке по левому краю
                              excel.WorkBooks[1].WorkSheets[1].Cells[3, 2].HorizontalAlignment := xlLeft;

                              // Выравнивам в ячейке по правому краю
                              excel.WorkBooks[1].WorkSheets[1].Cells[3, 4].HorizontalAlignment := xlRight;

                              // Обьединяем ячейки ‘A1:A8’
                              excel.WorkBooks[1].WorkSheets[1].Range[‘A1:A8’].Merge;

                              // Поворачиваем слова под углом 90 градусов для второго ряда
                              excel.WorkBooks[1].WorkSheets[1].Rows[2].Orientation := 90;

                              // Поворачиваем слова под углом 45 градусов для диапазона ячеек ‘B3:D3’
                              excel.WorkBooks[1].WorkSheets[1].Range[‘B3:D3’].Orientation := 45;

                              //рисуем границы  выделенного диапазона левая
                              excel.Selection.Borders[xlEdgeLeft].LineStyle := xlContinuous; // стиль линии сплошная
                              excel.Selection.Borders[xlEdgeLeft].Weight := xlMedium;// толщина линии

                              //рисуем границы  выделенного диапазона верхняя
                              excel.Selection.Borders[xlEdgeTop].LineStyle := xlContinuous;
                              excel.Selection.Borders[xlEdgeTop].Weight := xlMedium;

                              //рисуем границы  выделенного диапазона нижняя
                              excel.Selection.Borders[xlEdgeBottom].LineStyle := xlContinuous;
                              excel.Selection.Borders[xlEdgeBottom].Weight := xlMedium;

                              //рисуем границы  выделенного диапазона правая
                              excel.Selection.Borders[xlEdgeRight].LineStyle := xlContinuous;
                              excel.Selection.Borders[xlEdgeRight].Weight := xlMedium;

                              //рисуем границы  выделенного диапазона вертикальные внутрениие
                              excel.Selection.Borders[xlInsideVertical].LineStyle := xlContinuous;
                              excel.Selection.Borders[xlInsideVertical].Weight := xlMedium;

                              //рисуем границы  выделенного диапазона горизонтальные внутрениие
                              excel.Selection.Borders[xlInsideHorizontal].LineStyle := xlContinuous;
                              excel.Selection.Borders[xlInsideHorizontal].Weight := xlMedium;

                              //автозаполнение выделенного диапазона
                              //для примера заполним область ячеек ‘A10:C10’ словом ‘привет’
                              //и размножим его вниз еще на пять ячеек ‘A10:C15’

                              excel.WorkBooks[1].WorkSheets[1].Range[‘A10:C10′].Value:=’привет’;

                              //выделяем диапазон ячеек ‘A10:C10’
                              excel.WorkBooks[1].WorkSheets[1].Range[‘A10:C10’].Select;

                              //автозаполняем (копируем) выделенным диапазоном область ячеек ‘A10:C15’
                              excel.selection.autofill(excel.WorkBooks[1].WorkSheets[1].Range[‘A10:C15’],xlFillDefault);

                              //отключаем предупреждения, чтобы не задавал вопросов о сохранении и других
                              excel.DisplayAlerts := False;

                               //сохраняем документ в формате Excel 97-2003
                               excel.ActiveWorkBook.Saveas(GetCurrentDir() + ‘отчет.xls’,xlExcel8);

                               //сохраняем документ в текущем формате Excel 2007
                               excel.ActiveWorkBook.Saveas(GetCurrentDir() + ‘отчет.xlsx’);

                              //закроем все книги
                              excel.Workbooks.Close;

                              //закрываем Excel
                              excel.Application.quit;

                              //освобождаем интерфейсы
                              excel := Unassigned;

                              Except

                              //обрабатываем ошибки
                              showmessage(‘Внимание! Произошла ошибка при создании MS Excel приложения’);

                              //закроем все книги
                              excel.Workbooks.Close;

                              //закрываем Excel
                              excel.Application.quit;

                              //освобождаем интерфейсы
                              excel := Unassigned;
                              end;
                              end;

                              При работе с листом Excel мы можем использовать следующие варианты:
                              — работать с областью Range[‘B3:D3’];
                              — работать с ячейкой Cells[2, 4] где 2 — ряд, 4 — колонка;
                              — работать с рядами Rows[1] или с диапазоном рядов Rows[‘1:5’];
                              — работать с колонками Columns[1] или диапазоном колонок Columns[‘A:I’];

                              Range[‘A1’] и Cells[1, 1] обозначают одно и тоже.

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

                              Например так:
                              //закроем все книги
                              excel.Workbooks.Close;

                              //закрываем Excel
                              excel.Application.quit;

                              //освобождаем интерфейсы
                              sheet:=Unassigned; //интерфейс листа если он был создан
                              WorkBook := Unassigned;//интерфейс рабочей книги если он был создан
                              excel := Unassigned;//интерфейс самого предложения если он был создан

                              end;

                              Ниже привожу пример вывода в Excel из Delphi таблицы умножения с подробными комментариями.

                              unit Unit1;

                              interface

                              uses
                                Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
                                Dialogs, comobj, StdCtrls, Excel_TLB;

                              type
                                TForm1 = class(TForm)
                                  Button1: TButton;
                                  procedure Button1Click(Sender: TObject);
                                private
                                  { Private declarations }
                                public
                                  { Public declarations }
                                end;

                              var
                                Form1: TForm1;
                                excel: variant; // Переменная в которой создаётся объект EXCEL
                                MyData: variant; // Переменная в которой формируется таблица умножения
                                i,j:integer;
                              implementation

                              {$R *.dfm}

                              procedure TForm1.Button1Click(Sender: TObject);
                              begin
                              try
                              // Обьект EXCEL
                              excel := CreateOleObject(‘Excel.Application’);
                              // Чтоб не задавал вопрос о сохранении документа
                              excel.DisplayAlerts := false;
                              // новый документ
                              excel.WorkBooks.Add;

                              //объявляем вариантный массив
                              MyData := VarArrayCreate([1,9,1,9],varVariant);
                              for I := 1 to 9 do
                              for J := 1 to 9 do
                                MyData[i,j]:=i*j;

                              // Обьединяем ячейки ‘A1:I1’
                              excel.WorkBooks[1].WorkSheets[1].Range[‘A1:I1’].Merge;
                              //Пишем заголовок
                              excel.WorkBooks[1].WorkSheets[1].Range[‘A1′].Value:=’Таблица умножения’;
                              // Выравнивам заголовок по центру
                              excel.WorkBooks[1].WorkSheets[1].Range[‘A1’].HorizontalAlignment := xlCenter;
                              // задаем ширину  колонок с A по I
                              excel.WorkBooks[1].WorkSheets[1].Columns[‘A:I’].ColumnWidth := 3;

                              //выделяем область таблицы умножения [‘A2:I10’] и рисуем границы
                              excel.WorkBooks[1].WorkSheets[1].Range[‘A2:I10’].select;
                              //рисуем границы  выделенного диапазона левая
                              excel.Selection.Borders[xlEdgeLeft].LineStyle := xlContinuous; // стиль линии сплошная
                              excel.Selection.Borders[xlEdgeLeft].Weight := xlThin;// толщина линии
                              //рисуем границы  выделенного диапазона верхняя
                              excel.Selection.Borders[xlEdgeTop].LineStyle := xlContinuous;
                              excel.Selection.Borders[xlEdgeTop].Weight := xlThin;
                              //рисуем границы  выделенного диапазона нижняя
                              excel.Selection.Borders[xlEdgeBottom].LineStyle := xlContinuous;
                              excel.Selection.Borders[xlEdgeBottom].Weight := xlThin;
                              //рисуем границы  выделенного диапазона правая
                              excel.Selection.Borders[xlEdgeRight].LineStyle := xlContinuous;
                              excel.Selection.Borders[xlEdgeRight].Weight := xlThin;
                              //рисуем границы  выделенного диапазона вертикальные внутрениие
                              excel.Selection.Borders[xlInsideVertical].LineStyle := xlContinuous;
                              excel.Selection.Borders[xlInsideVertical].Weight := xlThin;
                              //рисуем границы  выделенного диапазона горизонтальные внутрениие
                              excel.Selection.Borders[xlInsideHorizontal].LineStyle := xlContinuous;
                              excel.Selection.Borders[xlInsideHorizontal].Weight := xlThin;

                              //присваиваем диапазону [‘A2:I10’] значения вариантного массива  MyData это значительно ускоряет работу, нежели вывод по //ячеечно

                              excel.WorkBooks[1].WorkSheets[1].Range[‘A2:I10’].Value:=MyData;

                              // Делаем его видимым
                              excel.Visible := true;
                              //освобождаем интерфейсы
                              MyData:= Unassigned;
                              excel := Unassigned;
                              Except
                              showmessage(‘Внимание! Произошла ошибка при создании MS Excel приложения’);
                              //закрываем Excel
                              excel.Application.quit;
                              //освобождаем интерфейсы
                              MyData:= Unassigned;
                              excel := Unassigned;
                              end;
                              end;

                              end.

                              При написании статьи использовался материал с сайта http://vlad2000.h1.ru/Frames/Statyi/page_14.html

                              От:

                              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...

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

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

                              Понравилась статья? Поделить с друзьями:
                            • Delphi excel формулу в ячейку
                            • Delphi excel формула ячейки
                            • Delphi excel формула в ячейке
                            • Delphi excel формат ячейки текстовый
                            • Delphi excel установить формат ячеек для всех ячеек