Страницы: 1
RSS
Запуск автокада через ексель, возникает ошибка в скрипте VBA
 
Доброго времени суток.

Создаю новую тему, так как старая тема: "Запуск 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

Заранее благодарю за помощь.  
 
Ошибка означает, что автокад не отвечает больше минуты.
Если файл большой, возможно проще сделать так.
При наличии файла через командную строку открыть и выйти из процедуры
.Повторить запуск макроса при открытом файле.
Изменено: Doober - 16.10.2016 20:08:15
 
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
Изменено: ZVI - 17.10.2016 01:01:18
 
Добрый день.

Скрипт VBA (попробовал):
Код
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
 
Уточнение:
Цитата
Если по каким-то причинам Вам нужно, чтобы VBA-код в Excel при этом дожидался открытия dwg, то уточните это
В общих чертах хотелось чтобы скрипт VBA Excel проверил запустился или нет файл AutoCAD .

Возможно сделать так, чтобы при загрузки файла AutoCAD был виден процесс загрузки. (через терминал  MsgBox)

А то при запуске скрипта видно только, что система "выполнят действие" а что происходит.
 
Цитата
ediczr написал: Ошибка "Microsoft Excel ожидает, пока другое приложение завершит действие OLE."
Возможно ли у Вас, что Autocad при запуске VBA кода что-то еще грузит или выполняет?
Закройте все окна Autocad и в пошаговом режиме отладки кода по нажатию F8 определите, на какой строчке кода возникает проблема.
 
И еще на всякий случай добавьте ниже строки
Set Acad = CreateObject("AutoCAD.Application")
такую вот строчку кода
If Err Then MsgBox "Ошибка регистрации AutoCAD", vbCritical, "Сбой!": Exit Sub
Изменено: ZVI - 17.10.2016 09:45:44
 
Цитата
Закройте все окна 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" 
 
Библиотеки подключенные в Excel VBA:

При отладки кода F8 тоже самое.
 
Так, уже теплее. Теперь откройте Автокад вручную и не загружайте файл. И снова пошагово по F8 пройдитесь по коду. Добавьте только в код строку из сообщения #8
 
Цитата
И еще на всякий случай добавьте ниже строки  
Set Acad = CreateObject("AutoCAD.Application")
такую вот строчку кода
If Err Then MsgBox "Ошибка регистрации AutoCAD", vbCritical, "Сбой!": Exit Sub

? Добавить после:
Код
Set Acad = GetObject(, "AutoCAD.Application")
или
Код
Set Acad = CreateObject("AutoCAD.Application")
 
Добавить после Set Acad = CreateObject("AutoCAD.Application")
 
Так как в картинке сообщения #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
Изменено: ZVI - 17.10.2016 11:33:57
 
На всякий случай уточню, что метод CreateObject не работает в некоторых версиях операционных систем, например в Home Edition или в Student версиях ОС,
 
Так по этапам:

#13
Цитата
Так, уже теплее. Теперь откройте Автокад вручную и не загружайте файл. И снова пошагово по 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
Изменено: ZVI - 17.10.2016 14:28:40
 
#18 (17 Окт 2016 14:26:48)

1. Отключил все библиотеки VBA принадлежащие "AutoCAD"



2. Запустил скрип #18 (17 Окт 2016 14:26:48) F8 (проверка)

- На этапе скрипта:
Код
Set AcadDoc = GetObject(FileDwg)  
AcadDoc.Application.Visible = True

Файл "AutoCAD" c чертеж (*.dwg) открыт

- На этапе:
Код
Set AcadDoc = Nothing

Остается только "морда" AutoCAD.
Изменено: ediczr - 17.10.2016 14:52:43
 
Тогда вот рабочий вариант для Вашего случая:
Код
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 (Исправлена опечатка в тексте)
 
Все классно, скрипт работает.

P.S.
От себя лично, выражаю большую благодарность Vladimir Zakharov за профессионализм.
Спасибо за помощь решении проблемы.
 
Это радует, что сработало! :)
Спасибо и Вам - было приятно общаться: оперативно всё протестировано с четкой трассировкой, наглядные скриншоты сообщений и даже переменных (Locals), что было приятным бонусом. Удачи Вам!
 
Здравствуйте извините если у меня "не коректный русский" , Я прошлась по вашим обяснениям, но никак не могу открыть автокад через excel .
влияет ли как-то если у меня windows 10?
и на другом  комп. у меня autocad LT  Я знаю что "макро" не работает в этой версии но не ужеле я не могу упровлять им через EXCEL?
Буду рада помощи спасибо!
 
LT управлять не сможете так как он не поддерживает VB.

Как вариант автоматизации для LT в экселе можете генерировать scr-файлы (текстовый файл, в котором записаны команды консоли автокада, на самом деле при должном уровне владения это очень мощная вещь). Насколько я помню, LT их поддерживает.

Но даже в этом случае функционал будет сильно ограничен так как через консоль нет возможности менять динамические атрибуты блоков (ну раньше так было, может в последних версиях что-то изменилось, но вряд ли).

В обычном акаде это решалось пользовательской командой на AutoLISP, но LT LISP так же не поддерживает.  
Изменено: Alexey_Spb - 31.12.2018 17:07:30
Страницы: 1
Читают тему
Наверх