Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Внизexcel в delphi цикл по строкам Найти похожие ветки
← →
123456789igor © (2012-09-08 20:12) [0]Начал изучать редактирование excel книг через delphi по началу было все понятно, пока не столкнулся с одним примером:
Вот картинки что есть и что надо получить:
до
[IMG]http://s1.ipicture.ru/uploads/20120908/EN8U64Hh.bmp[/IMG]
после
[IMG]http://s1.ipicture.ru/uploads/20120908/Et6puQCQ.bmp[/IMG]
Задание:
1) После каждой строки добавить 3 пустых строки
2) Объединение
3) С чем пока совсем глухо это в образовавшейся так сказать "матрице"(выделена жирным) вокруг одного числа, к примеру 2,45 заполнить 7 близлежащих ячеек значениями 2,45+-10%от этого числа(так же с 4,56 и 7,67) цифры и задание выдумано мной для практики
ну значит по сути все что надо мне сделать это разобраться с проходом цикла по строкам(так как я не знаю какое конечное кол-во строк в документе)
Как я себе это представил[CODE]
procedure TForm1.Button1Click(Sender: TObject);
begin
try
for номер строки равен от 1 до n do
begin
создать новую строку
создать новую строку
создать новую строку
номер строки:=номер строки+1;(что бы перескакивал через изначально 2ую строку и после нее рисовал ещё 3)
end;[/CODE]
но реализовать это программно у меня не входит
Так же пробовал с объединением:[CODE]
for a_:=1 to 5 do
begin
excel.WorkBooks[1].WorkSheets[1].Range["a_,5"].Merge;
end;[/CODE]
тоже не выходит, а так все команды, без циклов, все получается:добавить стоку после какой-то строки или объединить или записать значение
p.s
читал форумы и книгу ВАСИЛИЯ КОРНЯКОВА ПРОГРАММИРОВАНИЕ ДОКУМЕНТОВ И ПРИЛОЖЕНИЙ MS OFFICE в DELPHI про массивы ничего(((
← →
sniknik © (2012-09-09 09:06) [1]цикл не нужен... используй их пореже для построчной/по ячеечной работы с Excel.
лучше ищи инфу как работать с макросами, это обычная практика, начать макрос, сделать все что нужно руками, записать макрос, а после смотреть его код и переносить в свою программу. так чтобы как можно меньше внешних вызовов было.
← →
Amoeba_ (2012-09-09 11:53) [2]http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1274
← →
123456789igor © (2012-09-09 14:49) [3]
> цикл не нужен... используй их пореже для построчной/по ячеечной
> работы с Excel.
> лучше ищи инфу как работать с макросами, это обычная практика,
> начать макрос, сделать все что нужно руками, записать макрос,
> а после смотреть его код и переносить в свою программу.
> так чтобы как можно меньше внешних вызовов было.
Я пробовал работать с макросами, но ведь программа будет обрабатывать разные документы и в них кол-во строк может отличаться и это количество мне не известно. Не пойму как тут без цикла.
А вот про макросы открываю документ(мне надо после каждой строчки добавить 3 пустые строки и так после каждой строки) делаю вручную и пишу макрос вот что получилось:
Sub Макрос1()
"
" Макрос1 Макрос
"
"
Rows("2:2").Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Rows("3:3").Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Rows("4:4").Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Rows("6:6").Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Rows("10:10").Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
End Sub
Но как мне поможет макрос если я не знаю кол-во строк изначально ведь от этого зависит кол-во новых, вставленных, строк?
← →
sniknik © (2012-09-09 14:54) [4]> если я не знаю кол-во строк
это секрет, конечно же, но оно точно такое же как в исходных данных...
т.е.
знаешь начало, знаешь сколько записей, значит знаешь конец... применяешь макрос на range (диапазон).
← →
123456789igor © (2012-09-09 15:05) [5]а как узнать сколько записей?
← →
123456789igor © (2012-09-09 15:19) [6]Вот код с которым мне помогли
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
Excel:= CreateOleObject("Excel.Application");
try
Excel.workbooks.open(GetCurrentDir() + "\book.xlsx");
try
for i:= Excel.WorkBooks[1].WorkSheets[1].UsedRange.Row + Excel.WorkBooks[1].WorkSheets[1].UsedRange.Rows.Count+1 downto
Excel.WorkBooks[1].WorkSheets[1].UsedRange.Row+1 do
begin
for j:=1 to 3 do
begin
Excel.WorkBooks[1].WorkSheets[1].Rows[i].insert(-4121);
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;
end;
excel.visible := true;
finally
Excel.ActiveWorkbook.Close;
end;
finally
end;
end;
end.
я почитал про UsedRange я так понял это прямоугольная область которая охватывает все ячейки(исп. и неисп.) правильно?
Тогда логично предположить что UsedRange.Row это все строки, так? Но что означает эта запись?
for i:= Excel.WorkBooks[1].WorkSheets[1].UsedRange.Row + Excel.WorkBooks[1].WorkSheets[1].UsedRange.Rows.Count+1 downto
Excel.WorkBooks[1].WorkSheets[1].UsedRange.Row+1 do
← →
123456789igor © (2012-09-09 18:45) [7]В общем добрался до следующего:
[CODE]
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.
[/CODE]
проблема с рандомом я хочу заполнить ячейки 8,14 и 9,14 случайным числом которое получ след образом: число b_+(или "-")0-10% от этого же числа но не знаю как осуществить + или - чтобы тоже рандомно выбирало знак
← →
123456789igor © (2012-09-10 22:39) [8]В общем я сам во всем разобрался и задача практически выполнена осталась она проблема:
допустим у меня есть 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]
← →
Медвежонок Пятачок © (2012-09-10 23:01) [9]а зачем здесь делфи вообще?
← →
Медвежонок Пятачок © (2012-09-10 23:06) [10]если цель - заполнить excel, то надо курить как это сделать самим экселем.
если цель научиться управлять книгой из делфи, то надо делать это опять же по максимуму используя средства самого экселя.
а то, что ты делаешь сейчас - это изучение алгоритмизации и циклов, но только через гланды. это надо осваивать в делфи без экселя.
← →
123456789igor © (2012-09-11 21:44) [11]Все всем спасибо программа написана.
Остался последний вопрос как сделать так, что бы пользователь сам мог выбрать файл с которым работает программа? Ну знаю что нужно вставить 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.
← →
MBo © (2012-09-11 21:53) [12]OpenDialog1.Execute - функция , возвращает результат.
В зависимости от него могут предприниматься действия с OpenDialog.Filename
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.076 c