Модераторы: MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как подключиться к открытой книге Excel, или открыто несколько экземпляров Excel 
:(
    Опции темы
oleg153
Дата 5.3.2007, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 1.3.2007

Репутация: нет
Всего: нет



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

Эта проблемма была описана здесь http://www.delphimaster.ru/cgi-bin/forum.p...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;

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: ActiveX/СОМ/CORBA"

Rrader
Girder

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Delphi
  • Вопросы по SQL и вопросы по базам данных, не связанные с Delphi, задавать здесь

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Rrader, Girder.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: ActiveX/СОМ/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0387 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.