Excel В Delphi Цикл По Строкам

Тема в разделе "Delphi - Система", создана пользователем 123456789igor, 8 сен 2012.

  1. 123456789igor

    123456789igor Active Member

    Регистрация:
    12 янв 2011
    Сообщения:
    29
    Симпатии:
    0
    Начал изучать редактирование excel книг через delphi по началу было все понятно, пока не столкнулся с одним примером:
    Вот картинки что есть и что надо получить:

    до
    [​IMG]
    после
    [​IMG]
    Задание:
    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 про массивы ничего(((
     
  2. 123456789igor

    123456789igor Active Member

    Регистрация:
    12 янв 2011
    Сообщения:
    29
    Симпатии:
    0
    В общем добрался до следующего:
    Код (Text):
    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% от этого же числа но не знаю как осуществить + или - чтобы тоже рандомно выбирало знак
     
  3. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Не понимаю в чем (с рандомом) у Вас проблема может возникнуть... :huh:
    Код (Delphi):
    // Вы тип не указали, поэтому Variant (универсальный случай)
    function RandomDeltaB(b_: Variant): Variant;
    var
    delta: Integer;
    result2: Variant;
    begin
    Randomize;
    //я хочу заполнить ячейки случайным числом которое получ след образом:

    { число b_+(или "-") }
    Result := b_;

    { 0-10% от этого же числа }
    delta := (b_ * 100)*10 div 100;
    Result2 := Random(delta)/100;

    { как осуществить + или - чтобы тоже рандомно выбирало знак }
    if (Random(10) > 5) then
    Result := Result + Result2
    else
    Result := Result - Result2;
    end;
     
  4. 123456789igor

    123456789igor Active Member

    Регистрация:
    12 янв 2011
    Сообщения:
    29
    Симпатии:
    0
    В общем я сам во всем разобрался и задача практически выполнена осталась она проблема:
    допустим у меня есть 7 ячеек(В них может быть число отличное от нуля либо ничего) по вертикали мне нужно сделать такое условие
    Если А пустая то переходим к следующей ячейке иначе копируем значение в стоящие следом 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]
     
  5. 123456789igor

    123456789igor Active Member

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

    Код (Delphi):
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    OpenDialog1.Execute;
    end;
    Но я не пойму как это осуществить для моей задачи вот мой код:

    Код (Delphi):
    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.
     
  6. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Код (Delphi):
    procedure TForm1.BitBtn1Click(Sender: TObject);
    begin
    OpenDialog1.Filter := 'Excel files (*.xlsx)|*.xlsx';
    if not OpenDialog1.Execute then // пользователь нажал "Отменить"
    Exit;

    Excel:= CreateOleObject('Excel.Application');
    try
    Excel.workbooks.open(OpenDialog1.FileName);
    try
    // Тело
    Excel.Visible := true;
    finally
    Excel.ActiveWorkbook.Close;
    end;
    finally
    end;
    end;
     
Загрузка...

Поделиться этой страницей