![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Delphi vs Макросы Excel [D7, XP]
Neket © (2008-02-26 12:34:00)Подскажите возможно ли совместное использование инструментов Delphi
и макросов Excel.
Объясню поподробнее.
Имеется экселевский шаблон. Я посредством Delphi вытягиваю из БД данные, обрабатываю их и вывожу в документ Excel. Но некоторые механизмы вычисления хотелось заложить в Сам эексель.
Для этого был написан макрос. (Одна функция) но если я прописываю в ячейку такую команду :
XL.Sheets[2].Cells.Item[i+19, 21].Formula:='=BB2AB(G'+Inttostr(i+19)+';R'+Inttostr(i+19)+')';
То вылетает ошибка. Тип которой не совсем понятен.
Но если записать так:
XL.Sheets[2].Cells.Item[i+19, 21].Formula:='BB2AB(G'+Inttostr(i+19)+';R'+Inttostr(i+19)+')';
А потом в самос екселе добавить = то тогда все нормально вычисляется.
Подскажите в чем может быть дело?
Neket (2008-02-26 15:33:00) [1]Ладно... Спорить надоело...
Скажу одно... У меня работает. Все как надо. Но я использую ExcelXP
Сергей М. (2008-02-26 14:40:00) [2]
> Neket
Ну ты и фрукт)
Специально для тех кто в танке цитирую tlb.pas от Excel2000:
_WorksheetDisp = dispinterface
['{000208D8-0000-0000-C000-000000000046}']
property Application: ExcelApplication readonly dispid 148;
property Creator: XlCreator readonly dispid 149;
property Parent: IDispatch readonly dispid 150;
procedureActivate(lcid: Integer); dispid 304;
...
Выделенное жирным видишь ?)
А теперь процитируй здесь тот же самый файл, но на предмет наличия в нем строки
propertyActivate
Palladin (2008-02-26 14:35:00) [3]сам то уже попробовал в project1 ?
Palladin (2008-02-26 14:34:00) [4]а чего вот то? ошибка
Neket (2008-02-26 14:31:00) [5]Воооотттт В том то и дело... Что если первый Шит у тебя уже активен то тогда Да, ошибочка вылетает.
А попробуй либо условием задать, либо поставить
procedure TForm1.Button1Click(Sender: TObject);
var
xl:olevariant;
begin
xl:=createoleobject('Excel.Application');
xl.Sheets[2].Activate:=True; // Главное что-бы шит был не активен
xl.Quit;
xl:=Unassigned;
end;
Palladin (2008-02-26 14:24:00) [6]попробуй, может все таки у тебя тоже ошибка?
Palladin (2008-02-26 14:24:00) [7]
> Neket (26.02.08 14:22) [15]
специально ради тебя потрудился написать Project1
procedure TForm1.Button1Click(Sender: TObject);
var
xl:olevariant;
begin
xl:=createoleobject('Excel.Application');
xl.Sheets[1].Activate:=True;
xl.Quit;
xl:=Unassigned;
end;
ошибка
офис 2k, d6
Neket (2008-02-26 14:22:00) [8]Ладно вы спецы... Спорить бесполезно. Но это работает. И это факт.
Все всем спасибо.
Сергей М. (2008-02-26 14:19:00) [9]
> попробуй выполнить этот кусочек кода в Дельфях
Пусть хоть заработается - даже пробовать не буду)
Activate - это глагол, а глагол - это действие, а действие - это метод.
Глупо пытаться присваивать действию значение)
Palladin (2008-02-26 14:16:00) [10]
> Neket (26.02.08 14:13) [12]
ошибка будет
Neket (2008-02-26 14:13:00) [11])))) Ну Ок... Согласен.
Но попробуй выполнить этот кусочек кода в Дельфях... И он отработается.;-)
Сергей М. (2008-02-26 14:06:00) [12]
> почему ты думаеш что это метот а не свойство?
Я ничего не думаю, сам Excel (2000) мне об этом говорит при попытке выполнить макрос:
Sub Макрос1()
'
' Макрос1 Макрос
' Макрос записан 26.02.2008 (xxxxxx)
'
'
Sheets("Лист1").Activate = True
End Sub
Дословный текст сообщения об ошибке при выполнении этого макроса:
Нельзя установить свойство Activate объекта Worksheet
Neket (2008-02-26 14:00:00) [13]Ага.... Проштудировал.
Ещё разок спасибо.
XLApp:=CreateOleObject('Excel.Application');
XL:=XLApp.Workbooks.Add('C:\template.xls');
If XL.Sheets[2].activate=false then XL.Sheets[3].activate:=true;
Ещё раз повторюсь работает.
И почему ты думаеш что это метот а не свойство?
Сергей М. (2008-02-26 13:54:00) [14]
> Потому как рабтает
Не может это
XL.Sheets[3].activate:=true;
работать.
> что это такое?
Справку уже проштудировал ?
Neket (2008-02-26 13:51:00) [15]
> Что за ерунда ?
> У объекта WorkSheet нет св-ва Activate. Есть метод Activate
Ну повсей вероятности он может возвращать булевское значение. Потому как рабтает ;-)
Опа... Заработало... Спасибо. А что это такое?
FormulaLocal ?
Сергей М. (2008-02-26 13:13:00) [16]
> У меня так:
> If XL.Sheets[2].activate=false
Что за ерунда ?
У объекта WorkSheet нет св-ва Activate. Есть методActivate.
> Одинаково
А как насчет Formula Local?
Neket (2008-02-26 13:02:00) [17]У меня так:
If XL.Sheets[2].activate=false then XL.Sheets[3].activate:=true;
XL.Sheets[2].Cells.Item[i+19, 21].Formula:='=BB2AB(G'+Inttostr(i+19)+';R'+Inttostr(i+19)+')';
Но попробовал и по твоему. Одинаково.
Сергей М. (2008-02-26 12:54:00) [18]А если так
XL.Sheets[2].Activate;
ActiveSheet.Cells.Item[i+19, 21].Formula:='=BB2AB(G'+Inttostr(i+19)+';R'+Inttostr(i+19)+')';
?
Neket (2008-02-26 12:50:00) [19]Project Project1.exe raised exeption class EOleException with message 'OLE error 800A03EC'. Process stopped.
Судя по коду наверное закриптованная ;-)
Сергей М. (2008-02-26 12:43:00) [20]
> Такая же ошибка.
Какая ? Секретная ?)