![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Нужно создать таблицу 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' или ' '. Помогите, пожалуйста с данной задачей... Я уже около недели мучаюсь, не могу решить... Заранее спасибо. Последний раз редактировалось Admin, 24.11.2011 в 09:49. |
#2
|
||||
|
||||
![]() 1. Не понятно как будет задаваться количество строк и столбцов.
2. Не понятно как должно происходить наполнение таблицы. Имеется в виду не заголовков, а самой таблицы. Google в помощь Последний раз редактировалось Ildar-tsr, 24.11.2011 в 06:40. |
#3
|
|||
|
|||
![]() Цитата:
Через Edit1 и Edit2 на форме задаётся количество строк и столбцов. Потом при нажатии на кнопку должна открыться оформленная таблица в EXCEl (как на 1-ом скрине). Наполнение самой таблицы происходит вручную, причём только 1-цами или пробелами. |
#4
|
||||
|
||||
![]() Я правильно понял алгоритм?
1. Через едиты задаем количество строк и столбцов. 2. Формируется таблица в excel'e. 3. Ручками заполняем таблицу. 4. Потом через программу в открытом excel'e, удаляем "ненужные" строки. Корректно? P.S. Сразу скажу, опишите последний пункт более подробно. А то какой-то принцип удаления непонятный. P.S.S Зачем на форме три lable'a? Google в помощь Последний раз редактировалось Ildar-tsr, 24.11.2011 в 10:56. |
#5
|
|||
|
|||
![]() Цитата:
Начну с меток : прикреплю скрин формы. в метке "ответ" думала отобразить полученные результаты, но откровенно гворя, я не уверена, что так получится.. По поводу последнего пункта с удалением строк: само задание состоит в том, чтобы отпреденить минимальное количество экспертов, которые ответят на все вопросы. Эксперты - строки, вопросы - столбцы, а 1-цы это вопросы, на которые может ответить эксперт. Столбец 'Weight' - это удельный вес по каждому эксперту. После первичного заполнения таблицы высчитывается этот вес. Далее нужно проводить сортировку: из первично полученных весов найти наименьший вес и удалить (или автоматически очистить) строку эксперта, но так, чтоб порядковый номер эксперта сохранился. Потом веса пересчитываются, но уже без этой строки. И снова надо найти наименьший вес и удалить соответствующую строку. Так до тех пор, пока при перерасчёте веса экспетов не сравняются. Ответом будут являться порядковые номера строк. |
#6
|
||||
|
||||
![]() Вот код набросал, который динамически задает количество строк и столбцов. Формулы не вставлял пока что, сильно на работе занят. Если что пиши в личные сообщения, или на 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
|
|||
|
|||
![]() Огромное СПАСИБО!!!)))
|