У меня проблема с созданием нового экземпляра 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, второй процесс завершается здесь: /
Итак, проблема в следующем:
Почему tExcelObjFrame.Action = acOLEActivate убивает второй процесс
Как заставить объектный фрейм активировать файл Excel во втором процессе
ИЗМЕНИТЬ
Я нашел здесь частичное объяснение (без четкого решения):
http://www.xtremevbtalk.com/showthread.php?t=292170
- Если ни один экземпляр Excel не запущен, OLE создает экземпляр Excel при доступе к объекту напрямую или посредством программирования.
- Если экземпляр Excel уже запущен, то это экземпляр, который используется объектом OLE.
Проблема в том, что объект OLE выбирает неправильный экземпляр Excel. Вопрос в том, есть ли способ указать OLE на конкретный экземпляр.
Та же проблема, что описана здесь (решение не дано):