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