Тема: Правильный вызов Excel из AutoCAD, чтобы дальше можно было работать с Excel
В своих программах я использую следующий вызов Excel из AutoCAD:
On Error Resume Next Set ПрограммаAutoCAD = ThisDrawing.Application If ПриложениеExcell Is Nothing Then ПроверитьПолучениеExcel: ' Функция GetObject, вызванная без указания первого аргумента, ' возвращает ссылку на экземпляр приложения. Если это приложение ' не запущено, возвращается ошибка. Обратите внимание на запятую, ' стоящую на месте отсутствующего первого аргумента. Set ПриложениеExcell = VBA.GetObject(, "Excel.Application") If ПриложениеExcell Is Nothing Then Set ПриложениеExcell = VBA.GetObject("", "Excel.Application") GoTo ПроверитьПолучениеExcel End If End If ' Проверка Excel. Если Excel выполняется, ' он вводится в таблицу выполняемых объектов (Running Object table). If DetectExcel = 0 Then Set ПриложениеExcell = Nothing GoTo ПроверитьПолучениеExcel End If Err.Clear ПриложениеExcell.Visible = True 'Описываем необходимые процедуры API: Private Declare Function FindWindow Lib "user32" Alias _ "FindWindowA" (ByVal lpClassName As String, _ ByVal lpWindowName As Long) As Long Private Declare Function SendMessage Lib "user32" Alias _ "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _ ByVal wParam As Long, _ ByVal lParam As Long) As Long Public Function DetectExcel() As Long ' Процедура находит выполняемый Excel и регистрирует его. Const WM_USER = 1024 Dim hWnd As Long ' Если Excel выполняется, этот вызов API возвращает его дескриптор. hWnd = FindWindow("XLMAIN", 0) If hWnd = 0 Then ' 0 означает, что Excel не выполняется. DetectExcel = 0 Exit Function Else ' Excel выполняется. Используйте функцию API SendMessage, чтобы ввести его в таблицу выполняемых объектов (Running Object Table). ' SendMessage hWnd, WM_USER + 18, 0, 0 DetectExcel = hWnd End If End Function
Далее можно работать в Excel сколько угодно, а потом когда надо закрыть файл Excel и запустить другой файл происходит следующее:
1) Закрываем Excel при этом процесс Excel остаётся активным в диспетчере задач, а сам Exel при этом уже закрыт. Спрашивается: почему остался работающим процесс, когда программа уже закрылась? Может надо чтобы команду закрытия процесса дал AutoCAD, потому что Excel запускался из AutoCAD? Как это сделать? Или надо специальным образом запускать Excel чтобы следить за тем когда он закрывается?
2) Если попытаться открыть другой файл Excel то Excel работает без отображения ячеек. На экране видны только команды меню и панели инструментов. Ячеек не видно, вместо них чертёж AutoCAD или окно другой работающей программы. Доступа к ячейкам нет. Ясно, что с таким Excelем работать нельзя, неопытных пользователей это просто приводит в ужас! Появляются претензии, что я своим макросом испортил настройки в компьютере и Excel перестал правильно работать! Конечно, чтобы справиться с этой проблемой надо закрыть Excel, открыть диспетчер задач, найти там всё ещё работающий процесс Excel и остановить его. После этого можно запускать снова Excel и никаких проблем не будет. Но разьве объяснишь это обычным пользователям, для обычных пользователей это просто дико слушать и в итоге программа никому не нравится. Спрашивается зачем было делать эту ложку дёгтя в бочка мёда работы Excel из AutoCAD? Как надо правильно запускать Excel из AutoCAD, чтобы он правильно закрывался и нормально потом запускался снова и не было претензий от других пользователей программы?