Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: ActiveX/СОМ/CORBA > Получить открытую книгу Excel по имени


Автор: MadMas 28.1.2009, 11:34
Есть несколько открытых книг Excel. Необходимо подключиться к одной из них (известно имя книги).
Код

  XL.ConnectKind := ckRunningInstance;
  XL.Connect; 
  XL.AutoQuit := False; 
  XL.Interactive[lcid] := true;
  XL.UserControl := True;
  XL.ScreenUpdating[lcid] := False; 
   for i:=1  to XL.Workbooks.Count do
   begin
      if XL.Workbooks.Item[i].Name='Книга1' then
      begin
      str:='yes';
      break;
      end
      else str:='fail!'
   end;


XL.Workbooks.Count почему-то все время равен 0. 

что не так, а? Во время выполнения открытые книги есть. 

Автор: Rrader 28.1.2009, 12:06
Есть подозрение на это:
Цитата

There is a MSKB article on this somewhere - what is probably actually happening is that a new hidden excel application is being created which has no workbooks open.

Автор: MadMas 28.1.2009, 12:27
Delphi - 7. офис - 2003 SP3. 

Вроде убила все процессы Excel, открыла книгу, запустила по новой. То что одна книга открыта - определилось, но вот название получать не хочет ни в какую. 

Причем не понятно как избавиться от ошибки с тем что не определяется ни одна книга - каким образом отследить что у пользователя не запущены "лишние" процессы?

Код

var xl: TExcelApplication;
    ASheet: TExcelWorksheet;
    AWorkBook: TExcelWorkbook;
    i:byte;
    str: string;
begin
xl:=TExcelApplication.Create(nil);
try
  XL.ConnectKind := ckRunningInstance; //присоединяемся к открытому процессу экселя
  {ckRunningInstance ckRunningInstance}
  XL.Connect; //подключаемся
  XL.AutoQuit := False; //автозакрытие экселя нам тоже не нужно
  XL.Interactive[lcid] := true; //разрешаем пользователю работать с этим экземляром excel -- сомнительно
  XL.UserControl := True;
  XL.ScreenUpdating[lcid] := False; //ЗАПРЕЩАЕМ ПЕРЕРИСОВКУ ЭКРАНА ДЛЯ УСКОРЕНИЯ РАБОТЫ
//подключаемся к открытой книге. имя книги из объекта настроек (ОН)
   if XL.Workbooks.Count=0 then ShowMessage('Нет ни одной открытой книги Excel!') else
   begin
       for i:=1  to XL.Workbooks.Count do
       begin
          if XL.Workbooks.Item[i].Name=St.BookName then
          begin
          str:='yes';
          break;
          end
          else str:='fail!'
       end;
   end;
//взять даные из листа эксель в объект расчеты

finally
 //отключаемся от экселя
 XL.UserControl := True; //отдали управление пользователю
 XL.Disconnect; //отключились
 FreeAndNil(XL); //освободили память
end;


Под отладчиком XL.Workbooks.Item[i].Name все время "Expression illegal in evaluator". :(

Автор: Данкинг 28.1.2009, 12:37
MadMas, а если подключаться через "createoleobject('excel.application')" ?

Автор: MadMas 28.1.2009, 14:19
Через OLE работает. Ладно, пусть тогда так.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)