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

StackOverflow https://stackoverflow.com/questions/839243

  •  22-07-2019
  •  | 
  •  

Вопрос

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

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

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

Итак, проблема в том, что:

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

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

Редактировать

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

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

Это было полезно?

Решение

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

Set myXL = CreateObject("Excel.Application")

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

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

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top