![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
подскажите код который делал бы объединение ячеек экселя с помощью цикла, нужно к примеру объединить пять ячеек по вертикали в первом столбце потом взять следующие пять ячеек и опять их объединить и так к примеру двести строк. у меня получается только последнее пять ячеек объединить, все ячейки перед ними просто пролистываются. вот мой код
Код:
unit merge;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Comobj;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
ExcelApp,
ExcelSheet,
ExcelCol,
ExcelRow,
Excel: Variant;
Size: real;
i, j, N, M: Word;
a_, b_:integer;
begin
// Запускаю приложение Excel
ExcelApp:=CreateOleObject('Excel.Application');
ExcelApp.Visible:=True;
// Создаю рабочую книгу
ExcelApp.Workbooks.Add(-4167);
ExcelApp.Workbooks[1].WorkSheets[1].Name:='Отчёт';
ExcelCol:=ExcelApp.Workbooks[1].WorkSheets['Отчёт'].Columns;
// Ширина ячейки StringGrid1.DefaultRowHeight
ExcelApp.Columns.Columns[1].ColumnWidth:=5;
ExcelApp.Columns.Columns[2].ColumnWidth:=18;
ExcelApp.Columns.Columns[3].ColumnWidth:=9;
ExcelApp.Columns.Columns[4].ColumnWidth:=12;
ExcelApp.Columns.Columns[5].ColumnWidth:=11;
ExcelApp.Columns.Columns[6].ColumnWidth:=13;
ExcelApp.Columns.Columns[7].ColumnWidth:=13;
ExcelApp.Columns.Columns[8].ColumnWidth:=13;
ExcelRow:=ExcelApp.Workbooks[1].WorkSheets['Отчёт'].Rows;
ExcelRow.Rows[1].Font.Bold:=True; // Заголовки столбцов - жирные
ExcelSheet:=ExcelApp.Workbooks[1].WorkSheets['Отчёт'];
begin
for a_:=17 to 226 do
ExcelApp.Range[ExcelSheet.cells[a_,1],ExcelSheet.cells[a_+5,1]].Select;
ExcelApp.Selection.merge;
a_:=a_+5;
end;
end;
end.
подскажите, плз. Последний раз редактировалось M.A.D.M.A.N., 25.06.2013 в 21:45. |
|
#2
|
||||
|
||||
|
Ячейки объединяются через установку в true свойства MergeCells объекта Range. Вот функция специально для этого
Код:
function SetMergeCells (Sheet: variant; Range: string; MergeCells: boolean): boolean;
begin
Result:= true;
try
ExcelApp.ActiveWorkbook.Sheets.Item[Sheet].Range[Range {напр. 'A1:C2'}].MergeCells:= MergeCells;
except
Result:= false;
end;
end; |
|
#3
|
||||
|
||||
|
И что, у вас компилятор не ругался на эту строчку?
Код:
a_:=a_+5; |
|
#4
|
|||
|
|||
|
а других вариантов разве нет? в моем варианте работает, только чуточку некорректно.
|
|
#5
|
||||
|
||||
|
Заметил ещё такое, не там где надо стоит оператор, поменяйте цикл на это, возможно заработает
Код:
for a_:=17 to 226 do begin ExcelApp.Range[ExcelSheet.cells[a_,1],ExcelSheet.cells[a_+5,1]].Select; ExcelApp.Selection.merge; a_:=a_+5; end; |
|
#6
|
||||
|
||||
|
Настоятельно рекомендую никогда не трогать счетчик цикла внутри самого цикла. Возможно в Delphi7 это и не вызывает ошибку компиляции, но в следующих версиях этот код уже не прокатит и это правильно. Вот такой вариант попробуйте:
Код:
a_:=17;
while a_ < 226
do begin
ExcelApp.Range[ExcelSheet.cells[a_,1],ExcelSheet.cells[a_+5,1]].Select;
ExcelApp.Selection.merge;
a_:=a_+5;
end;Последний раз редактировалось Страдалецъ, 26.06.2013 в 09:32. |
|
#7
|
|||
|
|||
|
Страдалец, в вашем варианте произошло объединение всех ячеек в диапазоне с 17 по 227 в одну ячейку.
|
|
#8
|
|||
|
|||
|
Цитата:
в вашем варианте выдает ошибку в строке Код:
a_:=a_+5; |
|
#9
|
||||
|
||||
|
Цитата:
|
|
#10
|
||||
|
||||
|
Ну я просто несколько изменил ваш цикл, чтобы ошибки не было. А вот содержимое особо и не изучал. А объединилось все видимо потому-что вы в диапозон не 5, а 6 ячеек впихиваете.
|
| Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение: | ||
Scorpuha (26.06.2013)
| ||
|
#11
|
|||
|
|||
|
Цитата:
сразу видно ГУРУ. исправил, все заработало. Спасибо. |