На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

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


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Вставка формулы в Excel
    Подскажите как вставить формулу в ячейку 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;


    но все это происходит так меееееедленно. Нет ли способа ускорить процес?
      По поводу второго могу порекомендовать убрать обновление экрана перед выполнением кода (_WordDoc как TWordDocument):
      ExpandedWrap disabled
        _WordDoc.Application.ScreenUpdating:=false;

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

      Добавлено
      а формулу я присваивала как:
      ExpandedWrap disabled
        Sheet.Cells.Item[i,j].Value:='=SUM(C6;C11;C14:C18)'
        Цитата 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 -
          Замни на FormulaR1C1 как это делает сам Excel
          ExpandedWrap disabled
            ActiveCell.FormulaR1C1 = "=VALUE(RC[-4])"
            Спасибо всем за ответы.

            Цитата 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)';


            Может я чего-то недопонимаю?
              Цитата
              С формулами все равно не получается.
              Она скорее всего матюгается на 'SUM' - эту функцию она не понимает даже если её ввести руками (#ИМЯ?).
              Цитата
              Пробовал. Выигрыш незначительный.
              Тогда можно попробовать сначала сгенерировать строку из адресов ячеек для Range, а потом проставить Borders для полученного диапазона(алгоритм сейчас не дам - занят, но к вечеру или завтра - попробую). Если и это не поможет, то тогда смирись - Excel вообще штука не быстрая.
                Этот вариант у меня сработал:
                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
                Пока всё.
                  Ураааааа! Работает!
                  Сделал так:
                  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. А у меня в сумируемых ячейках уже есть значения и их то и надо просумировать и показать пользователю.
                    Попробуй Sheet.Calculate (или Range.Calculate) - он должен форсировать пересчет данных, но я не проверял.
                      Цитата 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';



                      Вылетает ошибка и в первом и во втором случае. Искал в инете - ничего толкового не могу найти. У меня нету этой чертовой справки ВБ.
                        1. Не знаю - не делал.
                        2. Это свойство - ReadOnly, установить его можно только при сохранении книги (WBRef.SaveAs)

                        Цитата
                        У меня нету этой чертовой справки ВБ
                        Переустановил бы Офис - ради разработки приложения можно и попотеть немного.
                          Понял. Еще раз спасибо.
                            Цитата Jureth, 4.10.04, 08:46
                            Переустановил бы Офис - ради разработки приложения можно и попотеть немного.

                            офис можно и доустановить, не удаляя его полностью :)
                              Вот так работает:
                              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 пользователей:


                              Рейтинг@Mail.ru
                              [ Script execution time: 0,1190 ]   [ 16 queries used ]   [ Generated: 5.08.25, 20:05 GMT ]