У меня проблема с созданием нового экземпляра 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-й процесс завершается здесь: /
Итак, проблема в следующем:
Почему tExcelObjFrame.Action = acOLEActivate убивает 2-й процесс
Как заставить Object Frame активировать файл Excel во 2-м процессе
EDIT
Я нашел здесь частичное объяснение (без четкого решения):
http://www.xtremevbtalk.com/showthread.php?t=292170
- Если экземпляр Excel не запущен, OLE создает экземпляр Excel при доступе к объекту напрямую или через программирование.
- Если экземпляр Excel уже запущен, то этот экземпляр используется объектом OLE.
Проблема в том, что объект OLE выбирает неправильный экземпляр Excel. Вопрос в том, есть ли способ указать OLE на конкретный экземпляр.
Та же проблема, описанная здесь (решение не дано):
http://groups.google.com/group/microsoft.public.win32.programmer.ole/browse_thread/thread/9c4cde2a79453037