Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 23.11.2011, 23:51
SIANAN SIANAN вне форума
Прохожий
 
Регистрация: 23.11.2011
Сообщения: 4
Репутация: 10
По умолчанию Помогите, пожалуйста, написать программу, работающую в Excel через Delphi

Нужно создать таблицу Excel, причём количество столбцов и строк должно задаваться с формы. Также присутствуют ещё 2 дополнительных столбца, в 1-ом подсчитывается построчно сумма, во 2-ом - отношение суммы по строке к общей сумме по всем строкам...

Пыталась написать сама, но у меня прога написана, мягко говоря, неккоректно....

Код:
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComObj, StdCtrls;
 
type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  XL, a: Variant;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Close;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
//Создание новой таблицы
XL:=CreateOleObject('Excel.Application');
XL.WorkBooks.Add;
XL.DisplayAlerts:=False;  // Вопрос о сохранении таблицы не задавать
 
a:=VarArrayCreate([1,6,1,12], varVariant);
 
XL.WorkBooks[1].WorkSheets[1].Range['A3'].Value:='1';
XL.WorkBooks[1].WorkSheets[1].Range['A4'].Value:='2';
XL.WorkBooks[1].WorkSheets[1].Range['A5'].Value:='3';
XL.WorkBooks[1].WorkSheets[1].Range['A6'].Value:='4';
XL.WorkBooks[1].WorkSheets[1].Range['A7'].Value:='5';
XL.WorkBooks[1].WorkSheets[1].Range['A8'].Value:='6';
XL.WorkBooks[1].WorkSheets[1].Range['B2'].Value:='1';
XL.WorkBooks[1].WorkSheets[1].Range['C2'].Value:='2';
XL.WorkBooks[1].WorkSheets[1].Range['D2'].Value:='3';
XL.WorkBooks[1].WorkSheets[1].Range['E2'].Value:='4';
XL.WorkBooks[1].WorkSheets[1].Range['F2'].Value:='5';
XL.WorkBooks[1].WorkSheets[1].Range['G2'].Value:='6';
XL.WorkBooks[1].WorkSheets[1].Range['H2'].Value:='7';
XL.WorkBooks[1].WorkSheets[1].Range['I2'].Value:='8';
XL.WorkBooks[1].WorkSheets[1].Range['J2'].Value:='9';
XL.WorkBooks[1].WorkSheets[1].Range['K2'].Value:='10';
XL.WorkBooks[1].WorkSheets[1].Range['L2'].Value:='11';
XL.WorkBooks[1].WorkSheets[1].Range['M2'].Value:='12';
XL.WorkBooks[1].WorkSheets[1].Range['N2'].Value:='Sum';
XL.WorkBooks[1].WorkSheets[1].Range['O2'].Value:='Weight';
 
//Оформление созданной таблицы
XL.WorkBooks[1].WorkSheets[1].Range['A1:O1'].Merge;
XL.WorkBooks[1].WorkSheets[1].Range['A1'].Value:='Определение min группы экспертов';
XL.WorkBooks[1].WorkSheets[1].Range['A1'].HorizontalAlignment:=3;
XL.WorkBooks[1].WorkSheets[1].Range['A:M'].ColumnWidth:=3;
 
//Вычисление сумм
XL.WorkBooks[1].WorkSheets[1].Range['N3'].Formula:='=sum(B3:M3)';
XL.WorkBooks[1].WorkSheets[1].Range['N4'].Formula:='=sum(B4:M4)';
XL.WorkBooks[1].WorkSheets[1].Range['N5'].Formula:='=sum(B5:M5)';
XL.WorkBooks[1].WorkSheets[1].Range['N6'].Formula:='=sum(B6:M6)';
XL.WorkBooks[1].WorkSheets[1].Range['N7'].Formula:='=sum(B7:M7)';
XL.WorkBooks[1].WorkSheets[1].Range['N8'].Formula:='=sum(B8:M8)';
XL.WorkBooks[1].WorkSheets[1].Range['N9'].Formula:='=sum(N3:N8)';
//Вычисление удельного веса каждого эксперта
XL.WorkBooks[1].WorkSheets[1].Range['O3'].Formula:='=N3/N9';
XL.WorkBooks[1].WorkSheets[1].Range['O4'].Formula:='=N4/N9';
XL.WorkBooks[1].WorkSheets[1].Range['O5'].Formula:='=N5/N9';
XL.WorkBooks[1].WorkSheets[1].Range['O6'].Formula:='=N6/N9';
XL.WorkBooks[1].WorkSheets[1].Range['O7'].Formula:='=N7/N9';
XL.WorkBooks[1].WorkSheets[1].Range['O8'].Formula:='=N8/N9';
 
XL.WorkBooks[1].WorkSheets[1].Range['B3:M8'].Value:=a;
XL.Visible:=true;
 
end;
 
end.
Админ: Пользуемся тегами для оформления кода!

А дальше нужно провести сортировку в последнем столбце (в столбце 'Weight'): найти min, потом удалить строку с этим значением, пересчитать этот столбец снова, учитывая оставшиеся данные и снова повторять эту операцию по удалению строки, пока не остануться варианты с равными значениями... В ответе надо вывести номера оставшихся строк.

Значение ячеек таблицы будут заполняться только '1' или ' '.

Помогите, пожалуйста с данной задачей... Я уже около недели мучаюсь, не могу решить... Заранее спасибо.
Изображения
Тип файла: jpg рисунок2.jpg (36.4 Кбайт, 5 просмотров)
Тип файла: jpg рисунок.jpg (36.6 Кбайт, 4 просмотров)

Последний раз редактировалось Admin, 24.11.2011 в 09:49.
Ответить с цитированием
  #2  
Старый 24.11.2011, 06:34
Аватар для Ildar-tsr
Ildar-tsr Ildar-tsr вне форума
Местный
 
Регистрация: 09.08.2011
Адрес: г.Сургут, ХМАО
Сообщения: 453
Репутация: 7402
По умолчанию

1. Не понятно как будет задаваться количество строк и столбцов.
2. Не понятно как должно происходить наполнение таблицы. Имеется в виду не заголовков, а самой таблицы.
__________________
Google в помощь

Последний раз редактировалось Ildar-tsr, 24.11.2011 в 06:40.
Ответить с цитированием
  #3  
Старый 24.11.2011, 10:42
SIANAN SIANAN вне форума
Прохожий
 
Регистрация: 23.11.2011
Сообщения: 4
Репутация: 10
По умолчанию

Цитата:
Сообщение от Ildar-tsr
1. Не понятно как будет задаваться количество строк и столбцов.
2. Не понятно как должно происходить наполнение таблицы. Имеется в виду не заголовков, а самой таблицы.



Через Edit1 и Edit2 на форме задаётся количество строк и столбцов. Потом при нажатии на кнопку должна открыться оформленная таблица в EXCEl (как на 1-ом скрине). Наполнение самой таблицы происходит вручную, причём только 1-цами или пробелами.
Ответить с цитированием
  #4  
Старый 24.11.2011, 10:53
Аватар для Ildar-tsr
Ildar-tsr Ildar-tsr вне форума
Местный
 
Регистрация: 09.08.2011
Адрес: г.Сургут, ХМАО
Сообщения: 453
Репутация: 7402
По умолчанию

Я правильно понял алгоритм?
1. Через едиты задаем количество строк и столбцов.
2. Формируется таблица в excel'e.
3. Ручками заполняем таблицу.
4. Потом через программу в открытом excel'e, удаляем "ненужные" строки.
Корректно?
P.S. Сразу скажу, опишите последний пункт более подробно. А то какой-то принцип удаления непонятный.
P.S.S Зачем на форме три lable'a?
__________________
Google в помощь

Последний раз редактировалось Ildar-tsr, 24.11.2011 в 10:56.
Ответить с цитированием
  #5  
Старый 24.11.2011, 12:37
SIANAN SIANAN вне форума
Прохожий
 
Регистрация: 23.11.2011
Сообщения: 4
Репутация: 10
По умолчанию

Цитата:
Сообщение от Ildar-tsr
Я правильно понял алгоритм?
1. Через едиты задаем количество строк и столбцов.
2. Формируется таблица в excel'e.
3. Ручками заполняем таблицу.
4. Потом через программу в открытом excel'e, удаляем "ненужные" строки.
Корректно?
P.S. Сразу скажу, опишите последний пункт более подробно. А то какой-то принцип удаления непонятный.
P.S.S Зачем на форме три lable'a?


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

По поводу последнего пункта с удалением строк: само задание состоит в том, чтобы отпреденить минимальное количество экспертов, которые ответят на все вопросы. Эксперты - строки, вопросы - столбцы, а 1-цы это вопросы, на которые может ответить эксперт. Столбец 'Weight' - это удельный вес по каждому эксперту.
После первичного заполнения таблицы высчитывается этот вес. Далее нужно проводить сортировку: из первично полученных весов найти наименьший вес и удалить (или автоматически очистить) строку эксперта, но так, чтоб порядковый номер эксперта сохранился. Потом веса пересчитываются, но уже без этой строки. И снова надо найти наименьший вес и удалить соответствующую строку. Так до тех пор, пока при перерасчёте веса экспетов не сравняются. Ответом будут являться порядковые номера строк.
Изображения
Тип файла: jpg рисунок3.jpg (33.8 Кбайт, 6 просмотров)
Ответить с цитированием
  #6  
Старый 24.11.2011, 13:07
Аватар для Ildar-tsr
Ildar-tsr Ildar-tsr вне форума
Местный
 
Регистрация: 09.08.2011
Адрес: г.Сургут, ХМАО
Сообщения: 453
Репутация: 7402
По умолчанию

Вот код набросал, который динамически задает количество строк и столбцов. Формулы не вставлял пока что, сильно на работе занят. Если что пиши в личные сообщения, или на ildar-tsr@yandex.ru Продолжим.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var e: OleVariant;
    m,n,i: integer;
begin
  e:= CreateOleObject('Excel.Application');
  e.Workbooks.Add;

  m:= StrToInt(Edit1.Text);
  n:= StrToInt(Edit2.Text);

  //Заполняем строки
  for i:= 1 to m do
    e.Cells[i+2,1].Value:= i;

  //Заполняем столбцы
  for i:= 1 to n do
    e.Cells[2,i+1].Value:= i;

  e.Range[e.Cells[1,1],e.Cells[1,n+3]].Select;
  e.Selection.Merge;
  e.Cells[1,1].Value:= 'Определение min группы экспертов';
  e.Cells[1,1].Select;
  e.Selection.HorizontalAlignment:= -4108;

  e.Cells[2,n+2].Value:= 'Sum';
  e.Cells[2,n+3].Value:= 'Weight';

  e.Visible:= true;
end;
__________________
Google в помощь

Последний раз редактировалось Ildar-tsr, 02.12.2011 в 07:55.
Ответить с цитированием
  #7  
Старый 24.11.2011, 13:18
SIANAN SIANAN вне форума
Прохожий
 
Регистрация: 23.11.2011
Сообщения: 4
Репутация: 10
По умолчанию

Огромное СПАСИБО!!!)))
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:53.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025