Создаю новую тему, так как старая тема: "Запуск AutoCAD через Excel" закрыта и отправлено в архив. Вопрос в ошибке проявляющая при выполнении скрипта VBA "Microsoft Excel ожидает, пока другое приложение завершит действие OLE." Скрипт VBA:
Код
Sub CreateDwg()
Const FileDwg = "I:\document\drawings.dwg" '<-- менять здесь
Dim Acad As Object, IsNew As Boolean
On Error Resume Next
Set Acad = GetObject(, "AutoCAD.Application")
If Err Then
IsNew = True
Err.Clear
Set Acad = CreateObject("AutoCAD.Application")
End If
On Error GoTo exit_
With Acad.Documents
If Dir(FileDwg) = "" Then
' Если файла FileDwg на месте нет, то создать новый
.Add
.SaveAs FileDwg
Else
' Файл FileDwg уже есть - открыть его
.Open FileDwg
End If
End With
exit_:
If Err Then MsgBox Err.Description, vbCritical, "Error"
End Sub
Скрипт работал пока файл AutoCAD весил не много, сейчас файл весит 29 Мбайт. Прошу помочь в решении данной проблемы (я понимаю, что файл долго загружается и происходит завершение процесса) ? Возможно решения вопроса: Ждать до конца выполнения exe, открываемого из excel
Ошибка означает, что автокад не отвечает больше минуты. Если файл большой, возможно проще сделать так. При наличии файла через командную строку открыть и выйти из процедуры .Повторить запуск макроса при открытом файле.
ediczr, как себя поведет вот такой код?(при условии, что файл существует)
Код
Sub OpenDwg()
Const FileDwg = "I:\document\drawings.dwg"
Dim Acad As Object
On Error Resume Next
Set Acad = CreateObject("AutoCAD.Application")
With Acad.Documents
.Open FileDwg
End With
If Err Then MsgBox Err.Description, vbCritical, "Error"
End Sub
Если проблема в том, что слишком долго открывается DWG файл, то предлагаю его открывать асинхронно с помощью Shell. При этом код в Excel просто запустит открытие файла в AutoCad и завершится, не дожидаясь завершения этого процесса. Если по каким-то причинам Вам нужно, чтобы VBA-код в Excel при этом дожидался открытия dwg, то уточните это.
Код
Sub CreateDwg()
Const FileDwg = "I:\document\drawings.dwg" '<-- менять здесь
Dim Acad As Object, IsNew As Boolean
On Error Resume Next
Set Acad = GetObject(, "AutoCAD.Application")
If Err Then
IsNew = True
Err.Clear
Set Acad = CreateObject("AutoCAD.Application")
End If
Acad.Visible = True
On Error GoTo exit_
With Acad.Documents
If Dir(FileDwg) = "" Then
' Если файла FileDwg на месте нет, то создать новый
.Add
.SaveAs FileDwg
Else
' Файл FileDwg уже есть - открыть его
'.Open FileDwg
Shell """" & Acad.Path & "\acad.exe"" " & """" & FileDwg & """"
End If
End With
exit_:
If Err Then MsgBox Err.Description, vbCritical, "Error"
End Sub
Уточню, что для LT версии AutoCad командная строка загрузки файлов не работает. И, соответственно, Shell тоже не сработает c AcadLT.exe
Sub OpenDwg()
Const FileDwg = "I:\document\drawings.dwg"
Dim Acad As Object
On Error Resume Next
Set Acad = CreateObject("AutoCAD.Application")
With Acad.Documents
.Open FileDwg
End With
If Err Then MsgBox Err.Description, vbCritical, "Error"
End
Ошибка осталась. Долго загружает AutoCAD и выводит ошибку с "Microsoft Excel ожидает, пока другое приложение завершит действие OLE."
Скрипт VBA:
Код
Sub CreateDwg()
Const FileDwg = "I:\document\drawings.dwg" '<-- менять здесь
Dim Acad As Object, IsNew As Boolean
On Error Resume Next
Set Acad = GetObject(, "AutoCAD.Application")
If Err Then
IsNew = True
Err.Clear
Set Acad = CreateObject("AutoCAD.Application")
End If
Acad.Visible = True
On Error GoTo exit_
With Acad.Documents
If Dir(FileDwg) = "" Then
' Если файла FileDwg на месте нет, то создать новый
.Add
.SaveAs FileDwg
Else
' Файл FileDwg уже есть - открыть его
'.Open FileDwg
Shell """" & Acad.Path & "\acad.exe"" " & """" & FileDwg & """"
End If
End With
exit_:
If Err Then MsgBox Err.Description, vbCritical, "Error"
End
Ошибка "Microsoft Excel ожидает, пока другое приложение завершит действие OLE."
Самое интересное в том, что если сделать:
1. Запустить файл "AutoCAD" и оставить его открытым. 2. Запустить "второй" скрипт VBA то файл "AutoCAD" запускается и выводит: открыть файл только для чтения ? Нажимаем ОК и файл загружается.
Проблема в процессе загрузки файла autoCAD через скрипт VBA
ediczr написал: Ошибка "Microsoft Excel ожидает, пока другое приложение завершит действие OLE."
Возможно ли у Вас, что Autocad при запуске VBA кода что-то еще грузит или выполняет? Закройте все окна Autocad и в пошаговом режиме отладки кода по нажатию F8 определите, на какой строчке кода возникает проблема.
И еще на всякий случай добавьте ниже строки Set Acad = CreateObject("AutoCAD.Application") такую вот строчку кода If Err Then MsgBox "Ошибка регистрации AutoCAD", vbCritical, "Сбой!": Exit Sub
Закройте все окна Autocad и в пошаговом режиме отладки кода по нажатию F8 определите, на какой строчке кода возникает проблема.
Программа AutoCAD закрыта . При проверки кода с пошаговым выполнением скрипта: Ошибка: "Microsoft Excel ожидает, пока другое приложение завершит действие OLE."
Код
Set Acad = CreateObject("AutoCAD.Application")
Дальше выполняет следующие строки скрипта:
Код
End If
cad.Visible = True
On Error GoTo exit_
При выполнении скрипта:
Код
With Acad.Documents
Завершает скрипт и переход на:
Код
If Err Then MsgBox Err.Description, vbCritical, "Error"
Попробовал поменять имя файла autoCAD на имя которого нет, для выполнения функции если нет то создать новый файл autoCAD. Происходит тоже самое, что и выше переход:
Код
If Err Then MsgBox Err.Description, vbCritical, "Error"
Так, уже теплее. Теперь откройте Автокад вручную и не загружайте файл. И снова пошагово по F8 пройдитесь по коду. Добавьте только в код строку из сообщения #8
И еще на всякий случай добавьте ниже строки Set Acad = CreateObject("AutoCAD.Application") такую вот строчку кода If Err Then MsgBox "Ошибка регистрации AutoCAD", vbCritical, "Сбой!": Exit Sub
Так как в картинке сообщения #12 Acad = Nothing, то у Вас по каким-то причинам в реестре оказался незарегистрирован корректно Autocad. Поэтому не работает CreateObject("AutoCAD.Application"). Такое чинится обычно через Восстановление приложения, если это есть в Autocad, или переустановкой Autocad. Но не будем торопиться. Вижу из сообщения #11 что в VBE-References установлена ссылка на AutoCAD 2012 Type Library, поэтому попробуйте еще такую версию кода:
Код
Sub CreateDwg()
' В VBE - References установить ссылку на AutoCad #### Type Library
Const TIMEOUT = 20 ' Время в секундах ожидания готовности Autocad
Const FileDwg = "I:\document\drawings.dwg" '<-- менять здесь
'Dim Acad As Object
Dim Acad As AcadApplication
Dim t As Single, IsReady As Boolean
On Error Resume Next
Set Acad = GetObject(, "AutoCAD.Application")
If Err Then
Err.Clear
'Set Acad = CreateObject("AutoCAD.Application")
Set Acad = New AcadApplication
If Err Then MsgBox "Ошибка регистрации AutoCAD", vbCritical, "Сбой!": Exit Sub
End If
On Error GoTo 0
Acad.Visible = True ' Должно отобразиться окно приложения Autocad
On Error GoTo exit_
' Ждать готовности Autocad
t = Timer + TIMEOUT
Do
DoEvents
IsReady = Acad.GetAcadState.IsQuiescent
If IsReady Then Exit Do
Loop While Timer < t
If Not IsReady Then
MsgBox "Приложение Autocad было занято в течение " & TIMEOUT & " секунд", vbExclamation, "Отмена"
Exit Sub
End If
With Acad.Documents
If Dir(FileDwg) = "" Then
' Если файла FileDwg на месте нет, то создать новый
.Add
.SaveAs FileDwg
Else
' Файл FileDwg уже есть - открыть его
.Open FileDwg
'Shell """" & Acad.Path & "\acad.exe"" " & """" & FileDwg & """"
End If
End With
exit_:
If Err Then MsgBox Err.Description, vbCritical, "Error"
End Sub
Так, уже теплее. Теперь откройте Автокад вручную и не загружайте файл. И снова пошагово по F8 пройдитесь по коду. Добавьте только в код строку из сообщения #8
1. Открыл только "морду" AutoCAD. 2. Добавил строчку (смотреть ниже) в скрипт #4 (17 Окт 2016 00:55:32)
Код
If Err Then MsgBox "Ошибка регистрации AutoCAD", vbCritical, "Сбой!": Exit Sub
Добавил ниже строки
Код
Set Acad = CreateObject("AutoCAD.Application")
3. При открытой "морде" AutoCAD файл запускается и работает. 4. Если "AutoCAD" не запущен, то происходит остановка выполнения скрипта и выводит ошибку. Остановка выполнения скрипта:
Код
If Err Then IsNew = True
Err.Clear
Set Acad = CreateObject("AutoCAD.Application")
#15
Цитата
Вижу из сообщения #11 что в VBE-References установлена ссылка на AutoCAD 2012 Type Library, поэтому попробуйте еще такую версию кода:
1. Открыл только "морду" AutoCAD. 2. Запустил скрипт #16 (17 Окт 2016 11:32:31) 3. При открытой "морде" AutoCAD файл запускается и работает. 4. Если "AutoCAD" не запущен, то происходит остановка выполнения скрипта и выводит ошибку.
Ни CreateObject() ни New AcadApplication у Вас не работают. И это никак не связано с размером DWG файла Отключайте все ссылки на AutoCAD в VBE-References. И пробуйте тогда так:
Код
Sub CreateDwg()
Const FileDwg = "I:\document\drawings.dwg" '<-- менять здесь
Dim AcadDoc As Object
' Проверить наличие файла
If Dir(FileDwg) = "" Then
MsgBox "Файл не найден:" & vbLf & FileDwg, vbExclamation, "Ошибка"
Exit Sub
End If
Set AcadDoc = GetObject(FileDwg)
AcadDoc.Application.Visible = True
Set AcadDoc = Nothing
End Sub
Sub CreateDwg()
Const FileDwg = "I:\document\drawings.dwg" '<-- менять здесь
Static AcadDoc As Object
' Проверить наличие файла
If Dir(FileDwg) = "" Then
MsgBox "Файл не найден:" & vbLf & FileDwg, vbExclamation, "Ошибка"
Exit Sub
End If
Set AcadDoc = GetObject(FileDwg)
AcadDoc.Application.Visible = True
End Sub
Изменено: ZVI - 18.10.2016 16:49:49(Исправлена опечатка в тексте)
Это радует, что сработало! Спасибо и Вам - было приятно общаться: оперативно всё протестировано с четкой трассировкой, наглядные скриншоты сообщений и даже переменных (Locals), что было приятным бонусом. Удачи Вам!
Здравствуйте извините если у меня "не коректный русский" , Я прошлась по вашим обяснениям, но никак не могу открыть автокад через excel . влияет ли как-то если у меня windows 10? и на другом комп. у меня autocad LT Я знаю что "макро" не работает в этой версии но не ужеле я не могу упровлять им через EXCEL? Буду рада помощи спасибо!
LT управлять не сможете так как он не поддерживает VB.
Как вариант автоматизации для LT в экселе можете генерировать scr-файлы (текстовый файл, в котором записаны команды консоли автокада, на самом деле при должном уровне владения это очень мощная вещь). Насколько я помню, LT их поддерживает.
Но даже в этом случае функционал будет сильно ограничен так как через консоль нет возможности менять динамические атрибуты блоков (ну раньше так было, может в последних версиях что-то изменилось, но вряд ли).
В обычном акаде это решалось пользовательской командой на AutoLISP, но LT LISP так же не поддерживает.