Добрый день. Для связи между двумя открытыми приложениями использую VBA через функцию Getobject. Для примера - хочу из открытого экземпляра Word получить доступ к уже открытому документу в Excel (в оригинале - нужно из открытого Autocad получить доступ в открытый же Excel, но поскольку проблема абсолютно аналогичная и с Word, легче порешать через него).
Для получения открытого экземпляра Excel использую стандартный код из Word (или из акада, не важно), который успешно работал всю жизнь примерно до перехода на 64 бит:
Код
Function din_get_excel() As Object
On Error Resume Next
Set din_get_excel = GetObject(, "Excel.Application")
If Err <> 0 Then
Set din_get_excel = CreateObject("Excel.Application")
End If
End Function
Соответственно, проверяю на таком:
Код
Sub tetst()
Dim fg
Set fg = din_get_excel
fg.Visible = True
fg.workbooks.Add
Set fg = Nothing
End Sub
Код у меня выполняется так: при первом запуске кода из Word код не видит открытый экземпляр Excel и создает свой собственный экземпляр Excel (если в этот новый экземпляр не добавить книгу, то он еще и сам закрывается после отработки кода). Повторный запуск кода успешно видит тот экземпляр Excel который был создан через код и не видит изначально открытый экземпляр. Если через Word создать экземпляр Excel, то после этого его видит не только код из Word, но и например код из Autocad.
Почитал, что описание "Excel.Application" прописано в реестре, нашел в реестре и такие значения, и с указанием версий "Excel.Application.16" - отрабатывает аналогично абсолютно. Галочку "игнорировать DDE- запросы" включал-отключал, не влияет никак.
Приведенная конструкция работала много лет с разными версиями офиса, вопрос - чем для кода отличается уже открытый экземпляр экселя от того, что он открывает сам. Порядок работы такой, что у меня открыт одновременно акад и эксель, и получить доступ нужно из открытому приложению, потом выбрать нужную книгу. Как вариант - пока запускаю эксель из акада, открываю из него нужный файл и работаю, но это слегка странные костыли.
Хотелось бы просто по Getobject получить уже открытый экземпляр экселя и не отвлекаться от работы, как оно было раньше.
Версия офиса - 2021 (в 2016 было аналогично), 64 бит, Автокад - 2019 и 2023, также 64 бит.
Если на форуме была такая тема - прошу ткнуть, т.к. я не нашел.
Dinoxromniy, добрый день! Вы нашли решение? После установки 2021 офиса столкнулся с той же проблемой. Всегда из акада связывался с экселем через GetObject(, "Excel.Application"). И далее обычно работал с активной книгой/листом. Как я понимаю, библиотека объектов та же, что и в предыдущих версиях, т.к. в Reference ничего кроме "Microsoft Excel 16.0 Object Library" системой не предоставляется. Правда у меня ссылка на экземпляр уже открытого приложения в автокаде создается (его видно в окне Locals), т.е. сам объект приложения присваивается, но при этом все переменные, касающиеся открытого содержимого (ActiveWindow, ActiveWorkbook ActiveSheet и т.д.) равны Nothing, некоторые коллекции (sheets, cells) равны <Application-defined or object-defined error>, коллекции Windows и Workbooks пустые (count = 0). Как будто после присвоения объекта автокад видит только оболочку, либо по GetObject изначально создает новый экземпляр (но, судя по хэлпу, это исключено функция getobject либо создает ссылку на открытый экземпляр, либо выдает ошибку).
Gr.Om, это новый экземпляр приложения, по умолчанию этот экземпляр не создает книг, просто создает невидимое пустое приложение. Попробуйте добавить в эксель новую книгу, прописать visible=true после этого msgbox выведите - будет видно, что это новый экземпляр приложения, и новые файлы будут иметь свою нумерацию "Книга 1", "Книга 2" и т.д., при этом в изначальном экземпляре эксель также может быть открыта своя "Книга 1". В одном приложении это невозможно, это именно два разных экземпляра. Более того, второй экземпляр будет доступен из под акада в дальнейшем.
Компа под рукой нет, вопрос решился частично - в связке с 2024 акадом часть проблем ушла, часть проблем решилась предварительным запуском экселя через shell.
С офисом 2021 (оф дистрибутив, триал) вообще странности наблюдаются - если запустить офис из пуска - успешно понимает все формулы. Если запускать существующий файл двойным щелчком - ведет себя как офис 2016 в плане формул, те не понимает формулы типа ОБЪЕДИНИТЬ и иже с ними. Примечательно, что операционная система новая/ чистая, других версий в принципе не стояло, и кроме того - запускается именно один и тот же exe-шник.
Знающие люди отправили разбираться к таблице com, которых в ос может быть открыто несколько, но внятного результата поиски не дали.
я открываю эксель программно из акада и работаю в дальнейшем с ним. Костыль, но в целом неудобства условные.
Dinoxromniy, конкретно в моем случае я кажется выяснил, что это за скрытый экземпляр. Поначалу подумал, что это из-за того, что эксель открыл файл в защищенном режиме, а после закрытия не выгрузился. Но после перезагрузки с открытием другого файла проблема снова появилась. В общем выяснил почти со 100% уверенностью, что источник проблемы крылся в проводнике. У него есть т.н. "область просмотра", которую можно включить в любой папке, эта область позволяет просматривать содержимое файлов. При выделении файла она дергает соответствующее приложение и отображает его красиво, как в приложении. И вот после такого просмотра акад в очередной раз зацепил пустой экземпляр без документов (в панели задач его нет), полез в диспетчер задач и вот он, висит. Завершил процесс, открыл нужный документ и акад успешно увидел этот единственный нужный экземпляр. Если у Вас проблемы выборочно на разных компьютерах, посмотрите, не включена ли там эта область просмотра. Еще она может быть включена в стандартном окне открытия файла, и тоже может вести себя так же.