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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.06.2013, 15:44
Scorpuha Scorpuha вне форума
Новичок
 
Регистрация: 13.06.2013
Сообщения: 77
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

подскажите код который делал бы объединение ячеек экселя с помощью цикла, нужно к примеру объединить пять ячеек по вертикали в первом столбце потом взять следующие пять ячеек и опять их объединить и так к примеру двести строк. у меня получается только последнее пять ячеек объединить, все ячейки перед ними просто пролистываются. вот мой код


Код:
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.


подскажите, плз.
Вложения
Тип файла: rar merge.rar (1.1 Кбайт, 0 просмотров)

Последний раз редактировалось M.A.D.M.A.N., 25.06.2013 в 21:45.
Ответить с цитированием
  #2  
Старый 26.06.2013, 07:56
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Ячейки объединяются через установку в 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  
Старый 26.06.2013, 09:13
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

И что, у вас компилятор не ругался на эту строчку?
Код:
a_:=a_+5;
Очень странно, вы должны были получить ошибку при компиляции этого кода.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #4  
Старый 26.06.2013, 09:15
Scorpuha Scorpuha вне форума
Новичок
 
Регистрация: 13.06.2013
Сообщения: 77
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

а других вариантов разве нет? в моем варианте работает, только чуточку некорректно.
Ответить с цитированием
  #5  
Старый 26.06.2013, 09:20
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Заметил ещё такое, не там где надо стоит оператор, поменяйте цикл на это, возможно заработает


Код:
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  
Старый 26.06.2013, 09:29
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Настоятельно рекомендую никогда не трогать счетчик цикла внутри самого цикла. Возможно в 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  
Старый 26.06.2013, 09:41
Scorpuha Scorpuha вне форума
Новичок
 
Регистрация: 13.06.2013
Сообщения: 77
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Страдалец, в вашем варианте произошло объединение всех ячеек в диапазоне с 17 по 227 в одну ячейку.
Ответить с цитированием
  #8  
Старый 26.06.2013, 09:42
Scorpuha Scorpuha вне форума
Новичок
 
Регистрация: 13.06.2013
Сообщения: 77
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Alegun
Заметил ещё такое, не там где надо стоит оператор, поменяйте цикл на это, возможно заработает


в вашем варианте выдает ошибку в строке

Код:
a_:=a_+5;
Ответить с цитированием
  #9  
Старый 26.06.2013, 09:45
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от Scorpuha
в вашем варианте выдает ошибку...
Страдалецъ уже объяснил почему.
Ответить с цитированием
  #10  
Старый 26.06.2013, 09:52
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Ну я просто несколько изменил ваш цикл, чтобы ошибки не было. А вот содержимое особо и не изучал. А объединилось все видимо потому-что вы в диапозон не 5, а 6 ячеек впихиваете.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
Этот пользователь сказал Спасибо Страдалецъ за это полезное сообщение:
Scorpuha (26.06.2013)
  #11  
Старый 26.06.2013, 10:03
Scorpuha Scorpuha вне форума
Новичок
 
Регистрация: 13.06.2013
Сообщения: 77
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Ну я просто несколько изменил ваш цикл, чтобы ошибки не было. А вот содержимое особо и не изучал. А объединилось все видимо потому-что вы в диапозон не 5, а 6 ячеек впихиваете.

сразу видно ГУРУ. исправил, все заработало. Спасибо.
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter