Тема подключения к открытому 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;
|
|