Этим способом я пользуюсь давно и он меня обычно не подводит:
'Код в модуле ОписаниеПеременных.bas
Public ПриложениеExcell As Excel.Application
Public ПрограммаAutoCAD As AcadApplication
'Описываем необходимые процедуры 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
'Код в любом модуле
Public Sub СоздатьТаблицу()
НазваниеПрограммы = "Таблица"
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
' Проверка Excel. Если Excel выполняется,
' он вводится в таблицу выполняемых объектов (Running Object table).
End If
If DetectExcel = 0 Then
Set ПриложениеExcell = Nothing
GoTo ПроверитьПолучениеExcel
End If
Err.Clear
ПриложениеExcell.Visible = True
Dim strИмяФайлаТаблицы As String
Dim strАдресФайлаТаблицы As String
strАдресФайлаТаблицы = ПолучитьПутьФайла(ПрограммаAutoCAD.FullName) & "Создание таблицы.xls"
strИмяФайлаТаблицы = ПолучитьИмяФайла(strАдресФайлаТаблицы)
Dim intКолвоОткрытыхКниг As Integer
Dim intНомКниги As Integer
intКолвоОткрытыхКниг = ПриложениеExcell.Workbooks.Count
For intНомКниги = 1 To intКолвоОткрытыхКниг
If ПриложениеExcell.Workbooks(intНомКниги).Name = strИмяФайлаТаблицы Then
If ПриложениеExcell.Workbooks(intНомКниги).FullName = strАдресФайлаТаблицы Then
GoTo АктивизироватьExcel
Else
ПриложениеExcell.WindowState = xlMinimized
ПрограммаAutoCAD.WindowState = acMax
glngОтвет = MsgBox("В приложении Excel уже открыт файл с именем: """ & strИмяФайлаТаблицы & """," & vbLf & _
"но из другой директории: """ & ПолучитьПутьФайла(ПриложениеExcell.Workbooks(intНомКниги).FullName) & """." & vbLf & _
"Сохранить изменения и закрыть файл (glngОтвет Да)," & vbLf & _
"не сохранять изменения и закрыть файл (glngОтвет Нет)," & vbLf & _
"отменить создание таблицы (glngОтвет Отмена).", vbYesNoCancel, НазваниеПрограммы)
If glngОтвет = vbYes Then
ПриложениеExcell.Workbooks(intНомКниги).Save
ElseIf glngОтвет = vbCancel Then
Exit Sub
End If
ПриложениеExcell.Workbooks(intНомКниги).Close
Exit For
End If
End If
Next intНомКниги
'Создать новуй базу данных таблицы
ПриложениеExcell.Workbooks.Open strАдресФайлаТаблицы
АктивизироватьExcel:
ПриложениеExcell.WindowState = xlMinimized
ПрограммаAutoCAD.WindowState = acMax
MsgBox "База данных для создания таблицы открыта!", vbInformation, НазваниеПрограммы
ПрограммаAutoCAD.WindowState = acMin
ПриложениеExcell.WindowState = xlMaximized
End Sub
Но мною замечено, что открытый таким способом Excel после закрытия файла оставляет процесс "Excel" в таблице запущеных процессов работающим и если при работающем процессе попытаться снова открыть Excel то некоторые элементы окна Excel например ячейки не видны на экране и с ними невозможно работать. Чтобы нормально снова запустить Excel надо остановить процесс вручную и потом можно запускать Excel как обычно. В добавление у меня вопрос: как сделать так чтобы процесс Excel при закрытии Exel останавливался и что на это влияет, почему он сам не останавливается?