• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о проекте, чтобы узнать больше. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Excel в Delphi, цикл по строкам

  • Автор темы Автор темы kler_93
  • Дата начала Дата начала

kler_93

Новые
Регистрация
8 Сен 2012
Сообщения
14
Реакции
0
Баллы
0
Excel в Delphi, цикл по строкам

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

до
EN8U64Hh.bmp

после
Et6puQCQ.bmp

Задание:
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 про массивы ничего(((
 
Ну во
1. если конечное кол-во строк в документе ты не знаешь то целесообразнее было бы использовать while.
2. ты сам ответил на свой вопрос, задай матрицу в документе по столбикам и строкам.
3. цикл объединения неправильно задан.

попробуй разбей все на отдельные процедуры и функции. и действуй от этого уже.
 
А как в delphi писать цикл пока не конец excel документа?
и ещё что-то я не понял про матрицу. Просто в ячейках и текст может быть.
Почему не правильно?

Если цикл не правильно работает, то почему он здесь работает?
randomize;
for a_:=1 to 5 do
begin
excel.WorkBooks[1].WorkSheets[1].Cells(a_,4):=random(200);
end;
 
вот справочник которым я пользуюсь не первый год
справочник функций и процедур - Delphi
Вот пытаюсь вставить строку между 3 и 4 строкой прога компилируется но вот при обработке ошибок выдает ошибку((
excel.WorkBooks[1].WorkSheets[1].Rows['4:4'].Select;
excel.WorkBooks[1].WorkSheets[1].Selection.Insert(Shift:=xlDown);
 
какую ошибку выдаёт? скинь текст программы
 
Уже нет ошибки вот что получилось
excel.WorkBooks[1].WorkSheets[1].Rows.Select;
excel.Selection.Insert(Shift:=xlDown);
Но все равно не могу понять как цикл организовать.
Мне надо так, что бы 3 строки вставлялись после 1ой строки и потом 3 строки после 2ой(т.е. цикл после добавления первых 3ёх должен перепрыгнуть через 1 строку и т.д.)
 
Я уже и так делал:
n:=excel.ActiveCell.Row;
i:=2;
while i <= n do
begin
excel.WorkBooks[1].WorkSheets[1].Rows.Select;
excel.Selection.Insert(Shift:=xlDown);
excel.WorkBooks[1].WorkSheets[1].Rows.Select;
excel.Selection.Insert(Shift:=xlDown);
excel.WorkBooks[1].WorkSheets[1].Rows.Select;
excel.Selection.Insert(Shift:=xlDown);
int(i);
end;
и сяк но не работает
 
У меня на этом компе компилятора нету,
попробуй цикл for, но задай так что бы i:= i + 1.
и выйди из цикла break (не особо это хорошо конечно, но что делать)
 
странно а почему такой цикл вообще не хочет работать?
n:=excel.ActiveCell.Row;
i:=2;
while i <= n do
begin
excel.WorkBooks[1].WorkSheets[1].Rows.Select;
excel.Selection.Insert(Shift:=xlDown);
end;
 
а вот так работает:
n:=excel.ActiveCell.Row;
i:=2;
while i < n do
begin
excel.WorkBooks[1].WorkSheets[1].Rows.Select;
excel.Selection.Insert(Shift:=xlDown);
inc(i);
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;
 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% от этого же числа но не знаю как осуществить + или - чтобы тоже рандомно выбирало знак
 
StringGrid1.Cells[i,0]:=inttostr(random(10000)-5000); - заполнить строку в массиве случайными числами от +10000 до -5000
 
В общем я сам во всем разобрался и задача практически выполнена осталась она проблема:
допустим у меня есть 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]
 
Условие If then else вводи и все.
на вскидку if a := " " tnen ...
 
Вот что получил, но не работает
if Excel.WorkBooks[1].WorkSheets[1].Range['P16']=' ' then
Excel.WorkBooks[1].WorkSheets[1].Range['P16'].Formula:='=Q16+N17';
 
Что-то в условии просто так
Excel.WorkBooks[1].WorkSheets[1].Range['P16'].Formula:='=Q16-N17';
работает
 
И почему когда Range нельзя указывать так Range[16,16] или так Range['16,16'] а только так Range['P16']?
 
можно указывать, смотри сайт который я тебе писал в теме по delphi там есть оформление range
 
я смотрел выбираю поиск по букве "R" а там нет range
 
Назад
Сверху