Проблема открытия Excel 2007 в новом экземпляре с использованием VBA (используя OLE и связанный объектный фрейм) - PullRequest
2 голосов
/ 08 мая 2009

У меня проблема с созданием нового экземпляра 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

объявление 1 2-й процесс excel.exe запускается

ad 2 Добавлена ​​эта строка для проверки того, что происходит со 2-м процессом

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

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

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

  2. Как заставить Object Frame активировать файл Excel во 2-м процессе

EDIT

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

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

Ответы [ 3 ]

1 голос
/ 17 июня 2011
Sub New_Excel()

'Create a Microsoft Excel instance via code using late binding. (No references required)

Dim xlApp As Object

Dim wbExcel As Object

'Create a new instance of Excel

Set xlApp = CreateObject("Excel.Application")

'Open workbook

Set wbExcel = xlApp.Workbooks.Open("Book1")  'or you may place here the complete name and path of the file you want to open upon the creation of the new instance

'Set the instance of Excel visible. (It's been hiding until now)

xlApp.visible = True

'Release the workbook and application objects to free up memory

Set wbExcel = Nothing

Set xlApp = Nothing

End Sub
1 голос
/ 08 мая 2009

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

Set myXL = CreateObject("Excel.Application")

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

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

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

0 голосов
/ 08 мая 2009

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

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

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

...