Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.14;
Скачать: CL | DM;

Вниз

Проблема с офисом 2000   Найти похожие ветки 

 
nickmas   (2006-04-08 02:53) [0]

Уважаемые мастера! Помогите разобраться в следующей проблеме:

Используя позднее связывание, создаю график в Excel-e:

...
Excel.Charts.Add;
Excel.Charts[1].ChartType:=xlXYScatterSmooth;

Добавляю данные в график:

Excel.Charts[1].SeriesCollection.NewSeries;
Excel.Charts[1].SeriesCollection[1].XValues:=VarArrayOf([xsr1,xsr2,xsr3]);
Excel.Charts[1].SeriesCollection[1].Values:=VarArrayOf([ysr1,ysr2,ysr3]);

И теперь привязываю данный график к листу с названием "Результат":

Excel.ActiveChart.Location(xlLocationAsObject,"Результат");

Так вот проблема в том, что у меня стоит 2003 офис и все нормально работает. Но..., как выяснилось позже, не работает на 2000 офисе. А именно: не хочет привязывать график к данному листу.

Может кто укажет, в чем тут моя ошибка?

Заранее благодарен!!!


 
balepa ©   (2006-04-08 06:59) [1]

Ошибка втом что ты пользуешся MS Office 2000


 
nickmas   (2006-04-08 16:06) [2]

Я пользуюсь MS Office 2003. Но меня также интересует, чтобы это приложение работало с любым офисом.


 
YurikGL ©   (2006-04-08 17:46) [3]

Посмотри на соответсвующие макросы 2000-го и 2003-го офисов... возможно, они разные...


 
nickmas   (2006-04-08 20:28) [4]

Дело в том, что одинаковые - я об этом тоже думал!?


 
nickmas   (2006-04-09 20:02) [5]

Кстати, ошибку выдает программа, когда я обращаюсь к графику после его создания:

Excel.Sheets[2].ChartObjects[1].Height:=139;
Excel.Sheets[2].ChartObjects[1].Width:=239;

А строку

Excel.ActiveChart.Location(xlLocationAsObject,"Результат");

видимо проходит, но не выполняет.

(Sheets[2] = "Результат")


 
nickmas   (2006-04-10 04:15) [6]

Не ужели нет ни у кого никаких мыслей?


 
ЮЮ ©   (2006-04-10 06:28) [7]

Excel.Charts[1]
Excel.ActiveChart
Excel.Sheets[2].ChartObjects[1]

Может не стоит работать с объектом с трех разных сторон, а остановиться на одной, успешно работающей?


 
sniknik ©   (2006-04-10 08:38) [8]

> Не ужели нет ни у кого никаких мыслей?
правильная мысль... поставь себе "офис 2000" и отлаживай/работай с ним если хочеш чтобы с ним тоже работало, и это не только иза данного конкретного глюка, а изза принципа поддерживаемости продуктов, сверху вниз она есть, а снизу вверх еще не придумали как.

кстати какого типа у тебя переменная Excel? вариант, или конкретного? если конкретного то какой модуль используется ExcelXP или Excel2000, и если взять 2000 то в нем у интерфейсов вообще есть те методы что ты используеш (на которых глюки)?


 
nickmas   (2006-04-10 08:47) [9]

Дело в том, что не со всеми свойствами объекта можно работать с трех сторон (по крайней мере у меня не получалось). Вот, например, чтобы изменить размер диаграммы, получилось только таким способом

Excel.Sheets[2].ChartObjects[1].Height:=139;
Excel.Sheets[2].ChartObjects[1].Width:=239;

а также изменить положение - тоже таким же способом

Excel.Sheets[2].ChartObjects[1].Left:=99;
Excel.Sheets[2].ChartObjects[1].Top:=14;

Да и, как мне кажется, не в этом дело. Лишь бы обращение к объекту было верным (для офиса 2003 верно - проверено).

А для офиса 2000... Может там нужно по другому как-то обращаться к данному объекту (хотя макросы пишутся одинаково, что в 2000, что в 2003). Или нужно подключить чего? (Excel2000 у меня подключен, а также ExcelXP и Excel97)

В общем жду совета, мастера!


 
nickmas   (2006-04-10 08:50) [10]

Excel у меня Variant


 
nickmas   (2006-04-10 08:55) [11]

Отлаживал, работал на другой машине правда, от туда и узнал, что глюк здесь

Excel.ActiveChart.Location(xlLocationAsObject,"Результат");

Не знаю как решить эту проблему. Вот и спрашиваю вас всех.


 
sniknik ©   (2006-04-10 09:02) [12]

> Excel2000 у меня подключен
просто подключить мало, надо им пользоваться (обьявить Excel: _Workbook; создавать Excel:= CoExcelWorkbook; ...)  тогда тебе будут доступны только его методы уже на этапе компиляции, лишнего не добавиш...
остальные (ExcelXP и Excel97) лишние, к тому же у тебя все одно только переменные(описания) из него используются.

> Excel у меня Variant
а вот у варианта проверка только на выполнении идет.


 
nickmas   (2006-04-10 14:02) [13]

Так ты мне предлагаешь полностью перейти с позднего связывания на раннее? Во-первых там достаточно много переделывать, а во-вторых - я с ранним связыванием так толком и не разобрался, хотя знаю, что оно предпочтительнее. Да и времени не так уж много, чтобы разбираться и все переделывать - эта программа - дипломная, и она уже готова, вопрос только в этом. Как найду решение, исправлю и все, готово.

А для себя, конечно, надо разобраться будет с ранним связыванием, но это уже будет позже, по крайней мере не для этой программы.

В общем, меня интересует решение данной проблемы при позднем связывании. Есть еще какие мысли по этому поводу?


 
EvS ©   (2006-04-10 14:31) [14]

>Excel.ActiveChart.Location(xlLocationAsObject,"Результат");
 
Excel.ActiveChart.Location(xlLocationAsObject,Excel.Sheets("Результат"));
 или что-то в этом духе. Вобщем надо лист указать, а не его имя


 
sniknik ©   (2006-04-10 14:59) [15]

> Так ты мне предлагаешь полностью перейти с позднего связывания на раннее?
хотябы проверить то что у тебя не идет, методов может не быть.

и то только после того как ты фактически проигнорировал "правильную мысль... " ([8]) писать и отлаживать с установленной минимальной версией того, что хочеш поддерживать.

> В общем, меня интересует решение данной проблемы при позднем связывании.
используя один продукт искать проблемы другого... это на сайт ясновидящих надо.


 
sniknik ©   (2006-04-10 15:02) [16]

> эта программа - дипломная, и она уже готова, вопрос только в этом. Как найду решение, исправлю и все, готово.
зачем вообще править? не проще ли показывать на установленной 2003 версии офиса, и все.


 
nickmas   (2006-04-10 16:53) [17]


> Excel.ActiveChart.Location(xlLocationAsObject,Excel.Sheets("Результат"));
>   или что-то в этом духе. Вобщем надо лист указать, а не
> его имя


Пробовал я по разному при офисе 2000: и так

Excel.ActiveChart.Location(xlLocationAsObject,Excel.Sheets("Результат"));

и так

Excel.ActiveChart.Location(xlLocationAsObject,Excel.Sheets[2]);

не идет.


 
nickmas   (2006-04-10 17:31) [18]


> хотябы проверить то что у тебя не идет, методов может не
> быть.


Согласен, но это приведет к тому (если при раннем связывании найду решение), что опять таки придется переделывать все на раннее связывание. А по этому поводу я уже высказывал свою ситуацию.

А делать прогу смешанную, т.е. с ранним и поздним связыванием одновременно, - я вообще не представляю что из этого получится. Думаю из этого ничего хорошего не выйдет.


> зачем вообще править? не проще ли показывать на установленной
> 2003 версии офиса, и все.


Дело в том, что у препода дома на компе стоит 2000-й офис, и естественно у него возник вопрос: "Почему программа не работает?". А это для него важно, чтобы дома работала, т.к. сейчас все стараются давать темы дипломных с корысными целями, чтобы он в данном случае мог пользоваться этой программой и в дальнешем. И еще немаловажный факт - попробуй докажи пожилому человеку, да еще и проофессору-математику, что у него софт, включая офис, древний. Естественно он скажет, что это программа плохо написана, что не работает у него на компьютере. В общем бесполезно и пытаться его заставить переустановить у себя офис.


 
sniknik ©   (2006-04-10 17:39) [19]

> Согласен, но это приведет к тому ...
ни к чему это не приведет, если сделаеш отдельную програмку тест, и будеш проверять нужные тебе методы на присутствие.


 
nickmas   (2006-04-10 19:13) [20]

To sniknik

Например, какие методы?


 
sniknik ©   (2006-04-10 20:20) [21]

> Например, какие методы?
а я знаю? смотри что ты там используеш, проверяй...
например
> Excel.ActiveChart.Location(xlLocationAsObject,Excel.Sheets("Результат"));
Excel - я, может не быть обьекта ActiveChart, у ActiveChart функции Location, Location может иметь не 2 параметра, не в том порядке и т.д.

при "моем" варианте тебе не правильно даже скомпилить не даст, а при "простановке" точки у обьекта будет список доступных методов предлагать. посмотриш кикие нужны (менно для 2000го) да и вставиш себе в позднее связывание.


 
nickmas   (2006-04-12 11:48) [22]

Не знал, что при простановки точки будет выскакивать меню с доступными методами и свойствами при раннем связывании. Спасибо за совет. Надо попробовать...


 
nickmas   (2006-04-15 13:37) [23]

Вот код маленькой программки "Тест", которая не работает с офисом 2000 имено из-за этой проблемы. Может так будет проще вам разобраться, в чем тут "бок".

...

uses ComObj, OleServer, Excel2000, ...;

...

procedure TForm1.Button1Click(Sender: TObject);
var
 Path, PathTemp: string;
 Excel: Variant;
begin
 Path:=Application.ExeName;
 PathTemp:="";
 While (Pos("\",Path)>0) do
   begin
     PathTemp:=PathTemp+Copy(Path,1,Pos("\",Path));
     Delete(Path,1,Pos("\",Path));
   end;
 Path:=PathTemp+"Data.xls";
 if FileExists(Path) then
   DeleteFile(Path);
 try
   Excel:=CreateOleObject("Excel.Application");
   Excel.WorkBooks.Add;
   Excel.Sheets[2].Activate;
   Excel.Sheets[2].Name:="График";
   Excel.Charts.Add;
   Excel.Charts[1].ChartType:=xlXYScatterSmooth;
   Excel.Charts[1].SeriesCollection.NewSeries;
   Excel.Charts[1].SeriesCollection[1].XValues:=VarArrayOf([1,2,3]);
   Excel.Charts[1].SeriesCollection[1].Values:=VarArrayOf([2,1,3]);
   Excel.ActiveChart.Location(xlLocationAsObject,"График");
   Excel.Sheets[2].ChartObjects[1].Height:=165;
   Excel.Sheets[2].ChartObjects[1].Width:=288;
   Excel.Sheets[2].ChartObjects[1].Left:=48;
   Excel.Sheets[2].ChartObjects[1].Top:=14;
   Excel.ActiveWorkbook.Close(SaveChanges:=True, Filename:=Path);
   Excel.Quit;
 except
   Excel.ActiveWorkbook.Close(SaveChanges:=False);
   Excel.Quit;
   MessageBox(Handle,"Не могу сохранить экспериментальные данные в Excel!","Информация",48);
 end;
end;


 
sniknik ©   (2006-04-15 15:15) [24]

понятно. вот и нашлась самая главная ошибка - писать так чтобы прятать ошибки, т.е. информацию в них, о том, что произошло...

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

переписывай этот кусок вот так, и иди снова проверять на машину с 2000м офисом, то что там выдаст, к этому надо будет прислушатся...  
procedure TForm1.Button1Click(Sender: TObject);
var
 FileName: string;
 Excel: OleVariant;
begin
 FileName:= ExtractFilePath(Application.ExeName)+"Data.xls";
 DeleteFile(FileName);
 Excel:= CreateOleObject("Excel.Application");
 try
   try
     Excel.WorkBooks.Add;
     Excel.Sheets[2].Activate;
     Excel.Sheets[2].Name:= "График";
     Excel.Charts.Add;
     Excel.Charts[1].ChartType:= xlXYScatterSmooth;
     Excel.Charts[1].SeriesCollection.NewSeries;
     Excel.Charts[1].SeriesCollection[1].XValues:= VarArrayOf([1,2,3]);
     Excel.Charts[1].SeriesCollection[1].Values:= VarArrayOf([2,1,3]);
     Excel.ActiveChart.Location(xlLocationAsObject, "График");
     Excel.Sheets[2].ChartObjects[1].Height:=165;
     Excel.Sheets[2].ChartObjects[1].Width:=288;
     Excel.Sheets[2].ChartObjects[1].Left:=48;
     Excel.Sheets[2].ChartObjects[1].Top:=14;
     Excel.ActiveWorkbook.Close(SaveChanges:=True, Filename:= FileName);
     Excel.Quit;
   except
     on E: Exception do
       Application.MessageBox(PChar("Не могу сохранить экспериментальные данные в Excel!"#10#13+
                                    "По причине ошибки :"#10#13#10#13+E.Message),"Ошибка!", MB_OK or MB_ICONERROR);

   end;
 finally
   Excel:= NULL;
 end;
end;


 
sniknik ©   (2006-04-15 15:54) [25]

тат подумал... первые две строки тоже бы надо внести внутрь try, особенно удаление, с небольшой добавкой, т.к. посмотрел оно делает только вызов виндовой процедуры, ексепта не выдает... поэтому

...
    try
      FileName:= ExtractFilePath(Application.ExeName)+"Data.xls";
      {$WARN SYMBOL_PLATFORM OFF}
      Win32Check(DeleteFile(FileName));
      {$WARN SYMBOL_PLATFORM ON}

      Excel.WorkBooks.Add;
...


 
nickmas   (2006-04-16 03:11) [26]

To sniknik:

Спасибо за совет, но там выдало следующее

Невозможно получить свойство ChartObjects класса Worksheet

т.е. то, о чем я и раньше твердил: не может найти график на втором листе, т.к. его ко второму листу не привязал.

Когда меняю второй лист на превый

Excel.Sheets[1].ChartObjects[1].Height:=165;
Excel.Sheets[1].ChartObjects[1].Width:=288;
Excel.Sheets[1].ChartObjects[1].Left:=48;
Excel.Sheets[1].ChartObjects[1].Top:=14;


то работает все нормально. Это говорит о том, что график не привязывается ко второму листу, а "ложится" по умолчанию на превый лист.

Кстати, об этом
Невозможно получить свойство ChartObjects класса Worksheet
пишет и в Делфи, когда запускаешь проект на выполнение в самом Делфи.

Но вот это тоже прикольно
on E: Exception do
Application.MessageBox(PChar("Не могу сохранить экспериментальные данные в Excel!"#10#13+"По причине ошибки :"#10#13#10#13+E.Message),"Ошибка!", MB_OK or MB_ICONERROR);

я просто не знал как это делается, да и до сих пор не совсем понял, как оно так работает:

что значит on E: Exception?
и #10#13#10#13+E.Message?

И вот этот случай
{$WARN SYMBOL_PLATFORM OFF}
Win32Check(DeleteFile(FileName));
{$WARN SYMBOL_PLATFORM ON}

"ругается"
Не удается найти указанный файл,
когда файла "Data.xls" не существует.
Чем это решение в данном случае плохое
if FileExists(FileName) then
  DeleteFile(FileName);
?


> иди снова проверять на машину с 2000м офисом

Задолбался я бегать - поставил себе вторую ОС и на нее офис 2000.

А вобще, спасибо за помощь!!!


 
sniknik ©   (2006-04-16 08:39) [27]

> Невозможно получить свойство ChartObjects класса Worksheet
это как раз то о чем я тебе "твердил"... нет обьекта/метода/... в старой версии (возможно есть аналог, но он не от листа идет а например обший от книги... ну там варианты возможны) т.е. то что я говорил предположительно то в ошибке указано явно (и не нужны долгие разговоры об этом, привел сообщение и все ясно).

> что значит on E: Exception?
> и #10#13#10#13+E.Message?
значит "при получении любого исключения после пустой строки показать оригинальный месайдж этого исключения"

> Не удается найти указанный файл,
д, это я не учел. когда убрал проверку if FileExists(FileName) then как раз подумал нафиг не нужна т.к. нет там ексептов, потом добавил уже в свой код возбуждение исключения но не вернул проверку, забыл.
правильнее так
{$WARN SYMBOL_PLATFORM OFF}
if FileExists(FileName) then Win32Check(DeleteFile(FileName));
{$WARN SYMBOL_PLATFORM ON}
и правильность не в только в этой конструкции а и в том что она внутри try except  см. [25]
нужна если по какойто причине старый файл не удается удалить... значит и ексель его переписать не сможет возможно (ну открыт уже ексклюзивно и т.д.) тогда причина будет в том же общем сообщении "Не могу сохранить ..." (т.е. неважно по какой причине не удалось, обработчик ексепта один на все получится)

> Задолбался я бегать - поставил себе вторую ОС и на нее офис 2000.
см. [8], с этого начал.  но ты посчитал тогда установку такогоже офиса как у препода слишком сложным (?) и искал обходные пути... теперь понял что на самом деле сложно? ;о))


 
nickmas   (2006-04-16 18:18) [28]


> это как раз то о чем я тебе "твердил"... нет обьекта/метода/.
> .. в старой версии (возможно есть аналог, но он не от листа
> идет а например обший от книги... ну там варианты возможны)
> т.е. то что я говорил предположительно то в ошибке указано
> явно


Хорошо, но почему, когда я ставлю первы лист
Excel.Sheets[1].ChartObjects[1].Height:=165;
Excel.Sheets[1].ChartObjects[1].Width:=288;
Excel.Sheets[1].ChartObjects[1].Left:=48;
Excel.Sheets[1].ChartObjects[1].Top:=14;

он находит этот объект?

И еще, если не трудно, подскажи пожалуйста, какие модули надо подключить для использования раннего связывания или еще чего там надо сделать (для того, чтобы после точки выскакивало меню с методами). А то я первы раз пытаюсь попробовать поработать с ранним связыванием, и... не получается. За основу взял пример

...
uses
 windows, sysutils, excel_tlb;
...
procedure CreateSpreadsheet(filename: string);
var
 xla: _Application;
 xlw: _Workbook;
 LCID: integer;
begin
 xla := CoApplication.Create;
 LCID := GetUserDefaultLCID;
 try
   xla.Visible[LCID] := true;
   // пустая книга
   //xlw := xla.Workbooks.Add(xlWBATWorksheet, LCID);
   // новая книга на основе шаблона
   xlw := xla.Workbooks.Add(
     "c:\delphi\excel\sample\demo.xlt",
     LCID);
   xla.Range["A1", "A1"].Value := "Date";
   xla.Cells[1, 2].Value := FormatDateTime("dd-mmm-yyyy", Now);
   xla.Cells[3, 1].Value := "Numbers";
   xla.Range["B3", "E3"].Value := VarArrayOf([1, 10, 100, 1000]);
   xla.Range["F3", "F3"].Formula := "=Sum(B3:E3)";
   OLEVariant(xla).Run(
     "Demo",
     FormatDateTime("dd-mmm-yyyy", Now)
     );
   xlw.SaveAs(
     filename,
     xlWorkbookNormal,
     "", "", False, False,
     xlNoChange,
     xlLocalSessionChanges,
     true, 0, 0, LCID);
 finally
   xla.Quit;
 end;
end;


импортировал EXCEL9.OLB, как там было рекомендовано. После чего подключил excel_TLB - нормально. Но не хочет понимать эту команду
CoApplication.Create
Почему? Или может пример я взял для изучения неудачный?


 
sniknik ©   (2006-04-16 19:30) [29]

> Хорошо, но почему, когда я ставлю первы лист
> ...
> он находит этот объект?
у меня нет 2000го (и ставить не собираюсь ;), предположить можно (в очередной раз ;), к примеру самой страницы нет... ну ты же не указываеш книге сколько страниц должно быть перед созданием, значит берет из дефаултных настроек. вполне может быть одна.
или в 2000м графики только на первой странице возможны ... (бред), либо еще чего.

> Но не хочет понимать эту команду
> CoApplication.Create
> Почему? Или может пример я взял для изучения неудачный?
старый возможно, посмотри в получившемся excel_TLB (это тоже что ранее упроминавшиеся Excel2000/ExcelXP) там скорее всего определена CoExcelApplication, ее и надо/можно использовать. а можно из нее CreateComObject вынести, то же самое будет.


 
nickmas   (2006-04-26 04:43) [30]

В общем я так и не понял почему оно не работает, но зато нашел другой выход, который меня устраивает.

Вместо следующих строчек кода

...
Excel.Charts.Add;
...
Excel.ActiveChart.Location(xlLocationAsObject, "График");
Excel.Sheets[2].ChartObjects[1].Height:=165;
Excel.Sheets[2].ChartObjects[1].Width:=288;
Excel.Sheets[2].ChartObjects[1].Left:=48;
Excel.Sheets[2].ChartObjects[1].Top:=14;
...


я использовал следующее:

...
Excel.Sheets[2].ChartObjects.Add(48,14,288,165);
Excel.Sheets[2].ChartObjects[1].Activate;
...


И все теперь работает, как в 2003, так и в 2000 офисе.

В общем проблема решена.

Отдельное спасибо sniknik!!!



Страницы: 1 вся ветка

Текущий архив: 2006.05.14;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.038 c
2-1145651181
Галинка
2006-04-22 00:26
2006.05.14
Где найти исключения/ошибки в Дельфи


2-1145691993
News
2006-04-22 11:46
2006.05.14
параметры ОЗУ


2-1146044236
Mozgan
2006-04-26 13:37
2006.05.14
ListBox + INI


2-1145814871
Первокласник Вася
2006-04-23 21:54
2006.05.14
Работа с ini - файлом. Как хранить и загружать значения?


4-1140485614
Svin
2006-02-21 04:33
2006.05.14
Добавление в ListView с помощью WinApi