Проблема с открытием excel 2007 в новом экземпляре с использованием VBA (с использованием OLE и привязанного фрейма объекта)

У меня проблема с созданием нового экземпляра Excel 2007 с помощью VBA (из Access 2002).

Сначала я неправильно понял проблему, и она сложнее, чем я думал.

Set myXL = CreateObject("Excel.Application")

Создает новые процессы (я думал, что нет), но все равно происходит странная вещь. Я использую OLE для хранения файлов Excel в базе данных SQL Server.

Это функция, которая привязывает файл Excel к форме:

Public Function OpenExcelObjFrame() As BoundObjectFrame
    Dim myXL As Object

    Set myXL = CreateObject("Excel.Application") '#1

    Set gTempWorkbook = myXL.Workbooks.Add
    myXL.Visible = True               '#2

    DoCmd.OpenForm "Excel_OBJ"
    Forms("Excel_OBJ").Visible = False
    Forms("Excel_OBJ").RecordSource = "SELECT Excel_File FROM Excel_File_Obj;"
    Set OpenExcelObjFrame = Forms("Excel_OBJ").Excel_File
End Function

Контекст:

Dim tExcelObjFrame As BoundObjectFrame
Set tExcelObjFrame = OpenExcelObjFrame()

tExcelObjFrame.Verb = acOLEVerbOpen
tExcelObjFrame.Action = acOLEActivate '#3

ad 1 запускается второй процесс excel.exe

объявление 2. Добавлена ​​эта строка, чтобы проверить, что происходит со вторым процессом.

ad 3 OLE привязывает файл к существующему экземпляру Excel, второй процесс завершается здесь: /

Итак, проблема в следующем:

  1. Почему tExcelObjFrame.Action = acOLEActivate убивает второй процесс

  2. Как заставить объектный фрейм активировать файл Excel во втором процессе

ИЗМЕНИТЬ

Я нашел здесь частичное объяснение (без четкого решения):

http://www.xtremevbtalk.com/showthread.php?t=292170

  1. Если ни один экземпляр Excel не запущен, OLE создает экземпляр Excel при доступе к объекту напрямую или посредством программирования.
  2. Если экземпляр Excel уже запущен, то это экземпляр, который используется объектом OLE.

Проблема в том, что объект OLE выбирает неправильный экземпляр Excel. Вопрос в том, есть ли способ указать OLE на конкретный экземпляр.

Та же проблема, что описана здесь (решение не дано):

http://groups.google.com/group/microsoft.public.win32.programmer.ole/browse_thread/thread/9c4cde2a79453037


person Pawel    schedule 08.05.2009    source источник


Ответы (2)


Обновление:
Я пробовал ваш существующий код на своей рабочей станции и:

Set myXL = CreateObject("Excel.Application")

похоже, работает так, как вы запрашиваете.
У меня был открыт один процесс, затем я запускаю эту строку, и она создает другой процесс.

Я исследовал немного дальше, и оказалось, что это своего рода причуда Excel 2007.
Все, на что я смотрел, возвращает меня к окнам тип файла (прокрутите вправо) или реестр, которые, по сути, меняют то же самое в этой ситуации.

Я знаю, что в VBA вы можете играть с ключами реестра с помощью CreateNewKey и SetKeyValue, но я не уверен, что вы захотите это сделать.

person Andy    schedule 08.05.2009
comment
Спасибо, Энди, да, я пробовал, но есть один процесс excel.exe. - person Pawel; 08.05.2009
comment
Я имел в виду, что я открыл один файл excel вручную, а затем использовал ваш код, чтобы открыть другой, но он не создал отдельный процесс excel.exe. - person Pawel; 08.05.2009
comment
Спасибо Энди, кажется, я недооценил проблему, спасибо за подсказки. - person Pawel; 08.05.2009

У меня были аналогичные проблемы только при попытке открыть несколько книг в отдельных экземплярах Excel 2007 - в Excel 2003 это работало нормально, но теперь все они открываются в одном экземпляре.

Я не знаю, решит ли это и вашу проблему, но я исправил ее (или заставил работать так, как я хотел!), Сказав Excel не использовать DDE (Параметры, Дополнительно, Общие, Игнорировать другие приложения, использующие DDE). Обратите внимание: если вы это сделаете, вам нужно будет изменить все типы файлов в проводнике, которые запускают Excel, поскольку они используют DDE по умолчанию - отредактируйте параметры файла, снимите флажок «Использовать DDE» и добавьте «% 1» в конец командная строка.

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

person njplumridge    schedule 08.05.2009