Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.09.2012, 19:44   #1
123456789igor
Пользователь
 
Регистрация: 19.04.2011
Сообщений: 62
По умолчанию excel в delphi цикл по строкам

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

до

после

Задание:
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 про массивы ничего(((

Последний раз редактировалось Stilet; 08.09.2012 в 19:59.
123456789igor вне форума Ответить с цитированием
Старый 09.09.2012, 00:28   #2
SNUPY
Форумчанин
 
Регистрация: 15.02.2008
Сообщений: 621
По умолчанию

Я тут уже многим говорил... не знаете как сделать это в Excel? Ну тогда запишите макрос на VBA и посмотрите на него код в делфи не сильно будет отличаться от этого макроса.
Код:
  Excel := CreateOleObject('Excel.Application');
  try
    Excel.workbooks.open('i:\temp\Êíèãà1.xlsx');
    try
      sheet := Excel.Sheets[1];
      for i:= sheet.UsedRange.Row + sheet.UsedRange.Rows.Count+1 downto
        sheet.UsedRange.Row+1 do
      begin
        for j:=1 to 3 do
        begin
          sheet.Rows[i].insert(-4121);
        end;
        sheet.Range[sheet.cells[i-1,1],sheet.cells[i+2,1]].merge;
      end;
      excel.visible := true;
    finally
      Excel.ActiveWorkbook.Close;
    end;
  finally
    Excel.Application.Quit;
  end;
PS третье задание не сделал, т.к. было лень
PPS не забудьте нажать на весы ^_^
Помог? Ну так нажми на весы!
SNUPY вне форума Ответить с цитированием
Старый 09.09.2012, 01:15   #3
123456789igor
Пользователь
 
Регистрация: 19.04.2011
Сообщений: 62
По умолчанию

Спасибо! Только я пол дня мучаюсь ни к чему толковому не пришел. А ваш код понять не могу пока. И это печально. Что от кода который не понимаешь, по крайней мере пока буду разбираться ещё раз спасибо

В общем добрался до следующего:
Код:
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;


     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;

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

 end;

end;

end.
проблема с рандомом я хочу заполнить ячейки 8,14 и 9,14 случайным числом которое получ след образом: число b_+(или "-")0-10% от этого же числа но не знаю как осуществить + или - чтобы тоже рандомно выбирало знак

как сделать так, что бы в 1ой колонке ячейки объединялись не по 4 а по 12 я попробовал вот так но что-то оно весь лист в одно объединяет:
Excel.WorkBooks[1].WorkSheets[1].Range[Excel.WorkBooks[1].WorkSheets[1].cells[i-5,1],Excel.WorkBooks[1].WorkSheets[1].cells[i+6,1]].merge;

Последний раз редактировалось Stilet; 09.09.2012 в 22:28.
123456789igor вне форума Ответить с цитированием
Старый 10.09.2012, 22:39   #4
123456789igor
Пользователь
 
Регистрация: 19.04.2011
Сообщений: 62
По умолчанию

В общем я сам во всем разобрался и задача практически выполнена осталась она проблема:
допустим у меня есть 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]
123456789igor вне форума Ответить с цитированием
Старый 11.09.2012, 21:37   #5
123456789igor
Пользователь
 
Регистрация: 19.04.2011
Сообщений: 62
По умолчанию

Все всем спасибо программа написана.
Остался последний вопрос как сделать так, что бы пользователь сам мог выбрать файл с которым работает программа? Ну знаю что нужно вставить 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.
123456789igor вне форума Ответить с цитированием
Старый 11.09.2012, 23:12   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Код:
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  if OpenDialog1.Execute then begin
    Excel:= CreateOleObject('Excel.Application');
    try
      Excel.workbooks.open(OpenDialog1.FileName);
      try
	  Тело
          excel.visible := true;
       finally
          Excel.ActiveWorkbook.Close;
     end;
   finally
  end;
 end;
end;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.01.2016, 18:24   #7
sonbullet
Новичок
Джуниор
 
Регистрация: 02.01.2016
Сообщений: 1
По умолчанию

подскажите,пожалуйста, как в excel через delphi записывать информацию(это понятно) и чтоб она сохранялась,а когда новый человек опять заполняет анкету,например, чтоб введенная информация сохранялась,а нового пользователя переводилась на новую строку.
sonbullet вне форума Ответить с цитированием
Старый 02.01.2016, 18:43   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
а нового пользователя переводилась на новую строку.
В экзел?? На новую строку?
Может лучше на новый лист? А вообще лучше вообще для каждой анкеты отдельно файл.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа по строкам! (Delphi) RNR Помощь студентам 1 06.06.2012 09:31
написать программу которая вводит по строкам с квеатуры двумерные массивы и вычисляет сумму его элементов по строкам таня99 Паскаль, Turbo Pascal, PascalABC.NET 3 23.05.2012 20:23
Как реализовать цикл While по строкам. Borland Delphi. Fri Помощь студентам 0 14.11.2011 17:32
Поиск одинаковых значений по строкам в excel Вяхирев_В Microsoft Office Excel 0 06.07.2010 20:01
как при импорте из Excel в delphi узнать сколько заполненных строк в книге Excel?чтобы организовать цикл betirsolt БД в Delphi 1 17.01.2010 18:51