Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> excel в delphi цикл по строкам 
:(
    Опции темы
123456789igor
Дата 8.9.2012, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 27.3.2011

Репутация: нет
Всего: нет



Начал изучать редактирование excel книг через delphi по началу было все понятно, пока не столкнулся с одним примером:
Вот картинки что есть и что надо получить:

до
user posted image
после
user posted image
Задание:
1) После каждой строки добавить 3 пустых строки
2) Объединение
3) С чем пока совсем глухо это в образовавшейся так сказать "матрице"(выделена жирным) вокруг одного числа, к примеру 2,45 заполнить 7 близлежащих ячеек значениями 2,45+-10%от этого числа(так же с 4,56 и 7,67) цифры и задание выдумано мной для практики

ну значит по сути все что надо мне сделать это разобраться с проходом цикла по строкам(так как я не знаю какое конечное кол-во строк в документе)
Как я себе это представил
procedure TForm1.Button1Click(Sender: TObject);
begin
try
for номер строки равен от 1 до n do
begin
создать новую строку
создать новую строку
создать новую строку
номер строки:=номер строки+1;(что бы перескакивал через изначально 2ую строку и после нее рисовал ещё 3)
end;
но реализовать это программно у меня не входит
Так же пробовал с объединением:
for a_:=1 to 5 do
begin
excel.WorkBooks[1].WorkSheets[1].Range['a_,5'].Merge;
end;
тоже не выходит, а так все команды, без циклов, все получается:добавить стоку после какой-то строки или объединить или записать значение
p.s
читал форумы и книгу ВАСИЛИЯ КОРНЯКОВА ПРОГРАММИРОВАНИЕ ДОКУМЕНТОВ И ПРИЛОЖЕНИЙ MS OFFICE в DELPHI про массивы ничего(((
PM MAIL   Вверх
123456789igor
Дата 9.9.2012, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 27.3.2011

Репутация: нет
Всего: нет



В общем добрался до следующего:
Код

unit new;

interface

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

type
 TForm1 = class(TForm)
   BitBtn1: TBitBtn;
   procedure BitBtn1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
  Form1: TForm1;
 excel: variant;
 i,j,k,a_:integer;
 c_,d_:real;
 const b_=1.22;
implementation

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Excel:= CreateOleObject('Excel.Application');
 try
   Excel.workbooks.open(GetCurrentDir() + '\book2.xlsx');
  
   try
    for i:= Excel.WorkBooks[1].WorkSheets[1].UsedRange.Rows.Count-1 downto 9 do
     begin
       for j:=1 to 3 do
       begin
         Excel.WorkBooks[1].WorkSheets[1].Rows[i].insert;
       end;
       Excel.WorkBooks[1].WorkSheets[1].Range[Excel.WorkBooks[1].WorkSheets[1].cells[i-1,1],Excel.WorkBooks[1].WorkSheets[1].cells[i+2,1]].merge;
       Excel.WorkBooks[1].WorkSheets[1].Range[Excel.WorkBooks[1].WorkSheets[1].cells[i-1,2],Excel.WorkBooks[1].WorkSheets[1].cells[i+2,2]].merge;

       Excel.WorkBooks[1].WorkSheets[1].Range[Excel.WorkBooks[1].WorkSheets[1].cells[i-1,6],Excel.WorkBooks[1].WorkSheets[1].cells[i+2,6]].merge;
       Excel.WorkBooks[1].WorkSheets[1].Range[Excel.WorkBooks[1].WorkSheets[1].cells[i-1,7],Excel.WorkBooks[1].WorkSheets[1].cells[i+2,7]].merge;
       Excel.WorkBooks[1].WorkSheets[1].Range[Excel.WorkBooks[1].WorkSheets[1].cells[i-1,8],Excel.WorkBooks[1].WorkSheets[1].cells[i+2,8]].merge;
       Excel.WorkBooks[1].WorkSheets[1].Range[Excel.WorkBooks[1].WorkSheets[1].cells[i-1,9],Excel.WorkBooks[1].WorkSheets[1].cells[i+2,9]].merge;
       Excel.WorkBooks[1].WorkSheets[1].Range[Excel.WorkBooks[1].WorkSheets[1].cells[i-1,10],Excel.WorkBooks[1].WorkSheets[1].cells[i+2,10]].merge;
       Excel.WorkBooks[1].WorkSheets[1].Range[Excel.WorkBooks[1].WorkSheets[1].cells[i-1,12],Excel.WorkBooks[1].WorkSheets[1].cells[i+2,12]].merge;

     Excel.WorkBooks[1].WorkSheets[1].cells[i,11]:=2;
     Excel.WorkBooks[1].WorkSheets[1].cells[i+1,11]:=3;
     Excel.WorkBooks[1].WorkSheets[1].cells[i+2,11]:=4;
     Excel.WorkBooks[1].WorkSheets[1].Range[Excel.WorkBooks[1].WorkSheets[1].cells[i-1,18],Excel.WorkBooks[1].WorkSheets[1].cells[i+2,21]]:='-';
     end;

[COLOR="Red"]
     randomize;

     for a_:=8 to 9 do
     begin
     c_:=(b_*0.01)+(b_*0.1)*random;
     d_:=b_*c_;
     Excel.WorkBooks[1].WorkSheets[1].cells[a_,14]:=b_+d_;
     end;[/COLOR]

     excel.visible := true;
   finally
     Excel.ActiveWorkbook.Close;
   end;
 finally

 end;

end;

end.

проблема с рандомом я хочу заполнить ячейки 8,14 и 9,14 случайным числом которое получ след образом: число b_+(или "-")0-10% от этого же числа но не знаю как осуществить + или - чтобы тоже рандомно выбирало знак
PM MAIL   Вверх
123456789igor
Дата 10.9.2012, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 27.3.2011

Репутация: нет
Всего: нет



В общем я сам во всем разобрался и задача практически выполнена осталась она проблема:
допустим у меня есть 7 ячеек(В них может быть число отличное от нуля либо ничего) по вертикали мне нужно сделать такое условие 
Если А[i] пустая то переходим к следующей ячейке иначе копируем значение в стоящие следом 3 ячейки
было:                          стало:
А1  17,33                    А1    17,33                           
А2                               А2    17,33
А3                               А3    17,33
А4                               А4    17,33
А5  13,23                    А5    13,23 
А6                               А6    13,23
А7                               А7    13,23
А8                               А8    13,23
А9                               А9
А10                             А10
А[n]                            A[n]
A[n+1]                        A[n+1] 
PM MAIL   Вверх
kami
Дата 10.9.2012, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



как-то так:
Код

var
  CellText: string;
  Sheet: OLEVariant;
  i: integer;

  Sheet:=Excel.WorkBooks[1].WorkSheets[1];
  i:=1;
  while i<n do
    begin
      if Sheet.Cells[i, 2].FormulaR1C1<>'' then
        CellText:=Sheet.Cells[i, 2].FormulaR1C1
      else
        Sheet.Cells[i, 2].FormulaR1C1:=CellText;
      inc(i);
    end;


Добавлено через 12 минут и 8 секунд
Кстати, эту длинную запись
Цитата(123456789igor @  9.9.2012,  17:47 Найти цитируемый пост)
Excel.WorkBooks[1].WorkSheets[1].Range[Excel.WorkBooks[1].WorkSheets[1].cells[i-1,1],Excel.WorkBooks[1].WorkSheets[1].cells[i+2,1]].merge;

можно сделать гораздо короче по тому же принципу:

Код

Sheet:=Excel.WorkBooks[1].WorkSheets[1]; // а если Excel.workbooks.open - функция и возвращает Workbook,
  // то Sheet:=Excel.workbooks.open(..).WorkSheets[1] - вы ведь не можете быть уверены в том, что ваша книга - единственная открытая
Sheet.Range[Sheet.Cells[i-1, 1], Sheet.Cells[i+2, 1]].Merge;

PM MAIL WWW   Вверх
123456789igor
Дата 10.9.2012, 23:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 27.3.2011

Репутация: нет
Всего: нет



FormulaR1C1 это что такое как тут указывать собственно саму формулу? я только такое видел:Formula

 я делал так но ничего не работает:
if Excel.WorkBooks[1].WorkSheets[1].Range['P16']=' ' then
Excel.WorkBooks[1].WorkSheets[1].Range['P16'].Formula:='=Q16+N17';
И почему когда Range нельзя указывать так Range[16,16] или так Range['16,16'] а только так Range['P16']?
PM MAIL   Вверх
123456789igor
Дата 11.9.2012, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 27.3.2011

Репутация: нет
Всего: нет



почему не работает данная запись?
if Excel.cells[a_,16] <> '' then
PM MAIL   Вверх
kami
Дата 11.9.2012, 07:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Цитата(123456789igor @  10.9.2012,  23:43 Найти цитируемый пост)
FormulaR1C1

Один из форматов записи формул. К примеру: в этом формате формула "сложить значение ячейки 3 строки 4 столбца с ячейкой 5 строки 2 столбца" будет выглядеть так:
"=R3C4+R5C2" - то есть Rномер_строкиCномер_столбца. Нумерация начинается с 1!!!
Имхо, гораздо удобнее всяких там "B52".

Цитата(123456789igor @  10.9.2012,  23:43 Найти цитируемый пост)
if Excel.WorkBooks[1].WorkSheets[1].Range['P16']=' ' then

Мое предложение по сокращению записи и более удобному оперированию вы проигнорировали. Ну да ваше право, хотите чтобы от обилия пустого кода глаза разбегались и приложение нещадно тормозило, делайте как делаете.
По факту:
Range['P16'].Text = ''
Цитата(123456789igor @  10.9.2012,  23:43 Найти цитируемый пост)
И почему когда Range нельзя указывать так Range[16,16] или так Range['16,16'] а только так Range['P16']?

Почему нельзя? Вроде, можно (пишу по памяти):
Код

Range(16,16).Text = ''


Добавлено через 5 минут и 14 секунд
В дополнение:
Когда указываете Cell[...].Formula:='....';, то приходится искать английские аналоги используемых функций.
Можно написать Cell[...].FormulaLocal:='=СУММ(A1:B5)';
PM MAIL WWW   Вверх
123456789igor
Дата 11.9.2012, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 47
Регистрация: 27.3.2011

Репутация: нет
Всего: нет



Все всем спасибо программа написана.
Остался последний вопрос как сделать так, что бы пользователь сам мог выбрать файл с которым работает программа? Ну знаю что нужно вставить OpenDialog затем кнопку "открыть" затем при нажатии на кнопку открывался файл, как-то так:

Код

procedure TForm1.Button1Click(Sender: TObject);
begin
            OpenDialog1.Execute;
end;


Но я не пойму как это осуществить для моей задачи вот мой код:

Код

unit new;

interface

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

type
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  excel: variant;
implementation

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Excel:= CreateOleObject('Excel.Application');
  try
    Excel.workbooks.open(GetCurrentDir() + '\book2.xlsx');
   
    try
      
      Тело

      excel.visible := true;
    finally
      Excel.ActiveWorkbook.Close;
    end;
  finally

  end;

end;

end.

PM MAIL   Вверх
kami
Дата 11.9.2012, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 23
Всего: 72



Код

if OpenDialog.execute then
  begin
    Workbook:=Excel.Workbooks.Open(OpenDialog.FileName);
    try
    .....
      Workbook.Close;
    end;
  end;


Цитата(123456789igor @  11.9.2012,  20:39 Найти цитируемый пост)
Excel.ActiveWorkbook.Close;

Потенциальный глюк, который обязательно проявится. Стоит только пользователю переключиться на другую книгу во время работы программы.
А если осталось 
Цитата(123456789igor @  9.9.2012,  17:47 Найти цитируемый пост)
Excel.WorkBooks[1].WorkSheets[1]...

то еще раньше - запустить программу, когда открыт какой-нибудь файл Excel.

Обход этого - в коде выше.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

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

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.2435 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.