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


Автор: oleg153 5.3.2007, 18:48
Тема подключения к открытому Excel , или открытому файлу книги изучена и понятна.
Проблема возникает (у меня) при условии когда открыто НЕСКОЛЬКО экземпляров Excel и в них разные файлы книг.
При этом GetActiveOleObject('Excel.Application') возвращает указатель только одного экземпляра Excel.
И если случайно книга была открыта в другом экземпляре, то программа ее не увидит и откроет второй экземпляр (только для чтения)

Эта проблемма была описана здесь http://www.delphimaster.ru/cgi-bin/forum.pl?id=1169756215&n=8&toprint=1,
но там я не нашел решения. Отослали к статье на английском но я разобраться не смог. 
Может кто обьяснить как используя CreateOleObject('Excel.Application'); это сделать.
А если невозможно, то может возможно сделать это через TExcelAplication ???

Вот такой код:
Код

implementation
uses
 ComObj;
var
 Excel,Workbook : Variant;
 WorkSheet: OleVariant;
const
 xlCellTypeLastCell = $0000000B;
{$R *.dfm}

{Активация сервера}
procedure TForm1.Button1Click(Sender: TObject);
var
 BookName1: string;
 j: integer;
 WorkBookRun: Boolean;
begin
 // Очищаем список запущеных книг
 Form1.Memo2.Clear;
 // Выбираем файл базы.
 try
 if OpenDialog1.Execute then
  begin
   BookName1:= OpenDialog1.FileName; // имя книги с полным путем
   //Запускаем Excel
   try
    //Ищем запущеный экземпляр Excel, если он не найден, вызывается исключение
    Excel := GetActiveOleObject('Excel.Application');
   except
    //Запускаем Excel
    Excel := CreateOleObject('Excel.Application');
    //Открываем нужную книгу
    WorkBook := Excel.WorkBooks.Open(BookName1);
    WorkBookRun:= True;
   end;
   //Проверяем что открыта нужная книга
   for j:=1 to Excel.Workbooks.Count do
    begin
     WorkBook:= Excel.Workbooks.Item[j];
     Form1.Memo2.Lines.Add(WorkBook.FullName); // чтобы убедиться что проверяет ВСЕ открытые книга
{Но по факту если открыли Excel и в нем 2 книги, затем 2-й Excel, а там еще 2 книги, то при запуске в
окне отражается только 2 книги.}
     if WorkBook.FullName=BookName1 then WorkBookRun:=True else WorkBookRun:=False;
    end;
    if not WorkBookRun then
     begin
      WorkBook:= Excel.WorkBooks.Open(BookName1);
      WorkbookRun:= True;
     end;
  end;
 finally
   if not WorkBookRun then ShowMessage('Ошибка');
 end;
 Excel.Visible:=True;
end;

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