Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Код VBA в Дельфи для Excel [D7, XP]


Megabyte ©   (2006-10-12 13:37:00) 

Нужно сделать одинаковое выравнивание в отчете, кот. вывожу в Excel(там цифры выравниваются по одному краю, текст - по другому).
Записав макрос, выяснил, какие свойства следует прописать: HorizontalAlignment = xlRight, VerticalAlignment = xlCenter.
Не понятно, какому из объектов/классов присваивать это свойство: Sheet.Cells[1, 2], Sheet.Columns[1], Sheet.Range['a4'], Sheet.Range['b4', 'e4']???
Компилятор ругается:
"Нельзя присвоить свойство HorizontalAlignment класса такого-то..."


Megabyte   (2006-10-17 12:08:00) [1]

Спасибо. Просто модуль не подключил нужный(ExceXP). Не подумал об этом, т.к. другие настройки работали. :)


EvS   (2006-10-16 18:05:00) [2]

> xlCenter

вообще лучше использовать константы, определенные в Delphi, см. Excel97,Excel2000,ExcelXP.
И попробуй после
Sheet:= WorkBook.WorkSheets[1];
вставить
Sheet.Activate;


Megabyte   (2006-10-16 17:28:00) [3]

Или же я баклан, какой-то модуль не подключил.
Прямое присваивание xlCenter какого-то числового значения ничего не дает.


Megabyte   (2006-10-16 17:27:00) [4]


> xlCenter - это число, а не строка. Уберите кавычки, и все заработает :)

Я пробовал и число подставлять, такая же фигня! Только надо определять xlCenter заранее, как числовую константу, иначе для Дельфи это непонятный идентификатор.


umbra   (2006-10-16 17:07:00) [5]


>      Sheet.Range['a1'].HorizontalAlignment := 'xlCenter';

xlCenter- это число, а не строка. Уберите кавычки, и все заработает :)


Megabyte   (2006-10-16 16:01:00) [6]

Я немного нагнал: Ругается не на этапе компиляции, а когда вызывается метод
Tfrm_itog.bbtn_excelClick


Megabyte   (2006-10-16 15:55:00) [7]

procedure Tfrm_itog.bbtn_excelClick(Sender: TObject);
var
 otchet, WorkBook, Sheet: Variant;
 Dataset : TpFIBDataSet;
 i, j, k : integer;
 c, r : string;
begin
 try
   try
     otchet:= CreateOleObject('Excel.Application');
     otchet.SheetsInNewWorkbook:= 1;
     WorkBook:= otchet.WorkBooks.Add;
     Sheet:= WorkBook.WorkSheets[1];
     DataSet:= TpFIBDataset(grd_result.DataSource.DataSet);

     //да вот хотя бы так делаю
     Sheet.Range['a1'].HorizontalAlignment := 'xlCenter';

     //????????? ?????????
     Sheet.Cells[1, 2].font.size := 15;
     Sheet.Cells[2, 2].font.size := 13;
     Sheet.Cells[1, 2].font.bold := true;
     Sheet.Cells[2, 2].font.italic := true;
     Sheet.Cells[1, 2].Value := cb_name.Text;
     Sheet.Cells[2, 2].Value := now;
     //????????? ???????? ?????
     for j := 1 to 4 do
       Sheet.Range['b4', 'e4'].Borders[j].LineStyle := 1;
     {//???????? ??????? ?????????
     Sheet.Cells[4, 1].Value := '?';}
     for i:= 0 to grd_result.Columns.Count-1 do begin
       //????????? ????? ????????
       Sheet.Range['a4'].Rowheight := 20;
       Sheet.Cells[4, i+2].font.bold := true;
       //?????????? ???????? ?????
       Sheet.Cells[4, i+2].Value := grd_result.Columns[i].Title.Caption;
     end;
     //????????? ?????? ????????
     Sheet.Columns[1].ColumnWidth := 5;
     Sheet.Columns[2].ColumnWidth := 30;
     Sheet.Columns[3].ColumnWidth := 20;
     Sheet.Columns[4].ColumnWidth := 20;
     Sheet.Columns[5].ColumnWidth := 20;
     //????????? + ????????? ???? ?????
     DataSet.First;
     For i := 1 to DataSet.RecordCount do
     begin
       for j := 1 to 4 do
       begin
         c := 'b' + IntToStr(4+i);
         r := 'e' + IntToStr(DataSet.FieldDefs.Count+1);
         Sheet.Range[c, r].Borders[j].LineStyle := 1;
       end;
       for k := 0 to Dataset.FieldCount-1 do
         Sheet.Cells[i+4, k+2] := DataSet.FieldList.Fields[k].Value;
       DataSet.Next;
     end;
     otchet.Visible:= true;

   except
     on E: Exception do
       MessageBox(handle, PChar('??????? ????????? ?????? ? Excel ???????????'
       + '??????? :'#13#10+ E.Message+ #13#10'????????? ??????? Excel-?'
       + '?? ?????????? .') , '??????', MB_ICONERROR+MB_OK)
   end;
 finally
   otchet:= Unassigned;
   Screen.Cursor:= crDefault;
 end;
end;


umbra   (2006-10-16 14:04:00) [8]


> Компилятор ругается:

Т.е. Вы пользуетесь TExelApplicationи иже с ним. Я так и не смог в нем разобраться :), поэтому использую ОЛЕ. В качестве противоядия, можно создать книгу-шаблон со всеми форматированием и затем добавлять книги по этому шаблону.


EvS   (2006-10-16 13:42:00) [9]


> Не понимаю, что делаю не так.


ну выложи свой код, может сообща найдем


Megabyte   (2006-10-16 12:15:00) [10]

Компилятор ругается:
"Нельзя присвоить свойство HorizontalAlignment класса Range"
:/
Не понимаю, что делаю не так. Остальные методы форматирования отчета(настройка шрифта, длины колонок и т.д.) в Excel нормально работают...


umbra   (2006-10-16 10:17:00) [11]

у меня следующий код работает без ошибок

uses ..., ComObj, Excel97, ...;

procedure TForm1.Button1Click(Sender: TObject);
var
 XLApp, Sheet: variant;
begin
 XLApp := CreateOleObject('excel.Application');
 if VarIsClear(XLApp) then exit;
 try
   XLApp.SheetsInNewWorkBook := 1;
   XLapp.Workbooks.Add;
   Sheet := XLApp.Workbooks[1].Worksheets[1];
   Sheet.Range['a1'].HorizontalAlignment := xlCenter;
   Sheet.Range['a1:c52'].HorizontalAlignment := xlCenter;
 finally
   XLApp.Visible := true;
   Xlapp := Unassigned;
 end;
end;


Megabyte   (2006-10-16 09:34:00) [12]

При использовании Selectionругается:
"Method 'Selection' not supported by automation object".

Пример либо левый, либо не полный... :/


EvS   (2006-10-12 17:39:00) [13]

нашел на скорую руку:
http://delphiworld.narod.ru/base/excel_cells_span_and_text_align.html


Megabyte   (2006-10-12 17:16:00) [14]


> Попробуйте сначала активировать нужный лист.

Что значит "активировать нужный лист"?
У меня всего один лист в отчете! Вставлял код выравнивания в различные этапы формирования отчета в экселе, даже после вывода на экран - результат один, как в [0].


umbra   (2006-10-12 15:31:00) [15]


> какому из объектов/классов присваивать это свойство

присваивать надо объекту Rangeи все ваши варианты должны работать. Попробуйте сначала активировать нужный лист.


Наверх

Титульная страница Поиск, карта сайта Написать письмо