Тема: Помогите с поздним связыванием библиотеки.

Делаю в Excel программу для связывания с автокадом. Задавал вопрос на форуме для офиса, но все упирается в объектную модель автокада.
Собственно сама проблема:
В Excel VBA через TOOLS - REFERENCES подключаю дополнительные библиотеки. В зависимости от того, какая версия автокада стоит у пользователя, необходимо программно подключить соответствующую библиотеку.
Например, acax16enu.tlb или acax17enu.tlb.
2 библиотеки от разных версий одновременно подключить не получается - выдает ошибку "Name conflicts with existing module, project, or object library".
Из-за этого приходится использовать позднее связывание.
Делаю так.

Public ACADApp As Object
...
Sub ЗагрузкаПриложенияAcad2005()
    Set ACADApp = CreateObject("AutoCAD.Application.16")
...
End Sub
Sub ОбработкаТекущегоЛистаACAD(i As Integer)
' Здесь мне нужно перебрать все элементы в пространстве листов.
' определяю переменную
Dim elem As AutoCAD.AcadEntity
For Each elem In ACADApp.ActiveDocument.PaperSpace
...
Next elem
End Sub

Ошибка вылезает на строке

Dim elem As AutoCAD.AcadEntity

пишет User-defined type not defined
Также не помогает замена AutoCAD.AcadEntity на ACADApp.AcadEntity и на ACADApp.Application.AcadEntity.
При раннем связывании (через TOOLS-PREFERENCES) такой ошибки не возникает и все работает как надо.
Пытаюсь определить переменную elem

Dim elem As Object
Set elem = ACADApp.AcadEntity

Ругается на elem: Object doesn't support this property or method (Error 438)
Через

Set elem = New ACADApp.AcadEntity 

тоже ничего хорошего не происходит.
Т.е. elem надо определять как-то по-другому.
Не откажите в помощи!

Re: Помогите с поздним связыванием библиотеки.

Попробуй заменить строку

Set ACADApp = CreateObject("AutoCAD.Application.16")

на

Set ACADApp = CreateObject("AutoCAD.Application")

То есть не указывать напрямую версию.

Re: Помогите с поздним связыванием библиотеки.

         Set oApp = Nothing
         Set oApp = GetObject(, "AutoCAD.Application")
         If oApp Is Nothing Then
            Set oApp = GetObject(, "AutoCAD.Application.16")
            If oApp Is Nothing Then
               Set oApp = GetObject(, "AutoCAD.Application.17")
            End If
         End If
         bAcad = Not oApp Is Nothing
         If oApp Is Nothing Then
            MsgBox "Main: " & Err.Description
            MsgBox "Autodesk AutoCAD не доступен", vbInformation
            Exit Sub
         End If

Re: Помогите с поздним связыванием библиотеки.

Спасибо brigval за код - возьму на вооружение.
Но, наверное, я опять поторопился и неверно обозначил ошибку.
Автокад загружается даже без указания версии, как советовал Кулик Алексей aka kpblc.
Я после загрузки автокада не могу открыть нужный файл и перебрать все элементы - подпрограмма ОбработкаТекущегоЛистаACAD в первом сообщении. Подпрограмма просто не выполняется - останавливается с ошибкой на этапе проверки подпрограммы перед выполнением.
Вот именно тут я застреваю.

Re: Помогите с поздним связыванием библиотеки.

А там и будет. Ты ж PaperSpace какой используешь? 0? 1? 10? Ты пытаешься обратиться к коллекции как к элементу пространства, не отслеживая ее заполненность. ИМХО надо как-то так:

Option Explicit
Global ACADApp As Object
Sub SetACADObject()
  ACADApp = GetObject(, "AutoCAD.Application")
End Sub
Function GetLayouts(objDoc As Object) As Variant
Dim Counter As Object, arSpaces() As Object
  For Each Counter In ThisDrawing.Layouts
    If IsEmpty(arSpaces) Then
      ReDim arSpaces(0)
    Else
      ReDim Preserve arSpaces(UBound(arSpaces) + 1)
    End If
    Set arSpaces(UBound(arSpaces)) = Counter
  Next Counter
  GetLayouts = arSpaces
End Function
Sub ProceedEntities(objSpace As Object)
Dim objEntity As Object
  For Each objEntity In objSpace
    ' Do smth
  Next objEntity
End Sub
Sub Main()
  SetACADObject
Dim lCounter As Long, Spaces As Variant
  Spaces = GetLayouts(ACADApp.activedocument)
  For lCounter = LBound(Spaces) To UBound(Spaces)
    ProceedEntities Spaces(lCounter)
  Next lCounter
End Sub

Код не проверял вообще.

Re: Помогите с поздним связыванием библиотеки.

Странно. На другой машине код работает, если определить elem так, как написал ниже.
От PaperSpace я отказался и сделал немного по-другому (выше был первоначальный вариант). Для моих нужд он более чем достаточен и работает на порядок быстрее.
Рабочий код:

Public elem As Object
Public ACADApp As Object
.....
Sub ЗагрузкаПриложенияAcad200х()
    Set ACADApp = CreateObject("AutoCAD.Application")
End Sub
Sub ОбработкаТекущегоЛистаACAD(i As Integer)
Set elem = ACADApp
Dim objSelSet
Dim objSelCol
Dim intType(0) As Integer
Dim varData(0) As Variant
...
BlockName = "Штамп"
Set objSelCol = ACADApp.ActiveDocument.SelectionSets
For Each objSelSet In objSelCol
    If objSelSet.Name = "BlockSelect" Then
        objSelSet.Delete
        Exit For
    End If
Next
Set objSelSet = objSelCol.add("BlockSelect")
intType(0) = 2
varData(0) = BlockName
objSelSet.Select 5, filtertype:=intType, filterdata:=varData
For Each elem In objSelSet
    If elem.EntityName = "AcDbBlockReference" Then
        With elem
...
            call ЗаполнитьСтроку
        End With
    End If
Next elem
ACADApp.ActiveDocument.Close savechanges:=False
End Sub

Но теперь возник еще один нюанс.
Подпрограмма выполняется, но процесс автокада не закрывается:

Sub ЗакрытиеПриложенияAcad200x()
  On Error GoTo ExitSub
  Application.StatusBar = "Закрытие AutoCAD..."
      Set ACADApp = Nothing
      ACADApp.Quit
ExitSub:
  Application.StatusBar = ""
End Sub

Re: Помогите с поздним связыванием библиотеки.

Сам нашел
нужно убрать строку Set ACADApp = Nothing
тогда получится так:

Sub ЗакрытиеПриложенияAcad200x()
  On Error GoTo ExitSub
  Application.StatusBar = "Закрытие AutoCAD..."
      ACADApp.Quit
ExitSub:
  Application.StatusBar = ""
End Sub

Кулик Алексей aka kpblc, brigval - огромное СПАСИБО за помощь.

Re: Помогите с поздним связыванием библиотеки.

> Loner Wanderer
Я бы строчку не убирал, просто поменяй их
местами

      ACADApp.Quit
      Set ACADApp = Nothing

~'J'~