VBA + Autocad+Excel
| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VBA + Autocad+Excel

VBA + Autocad+Excel

Ответ
Поиск в этой теме
Непрочитано 09.01.2008, 15:33 #1
VBA + Autocad+Excel
gizmo_zx
 
Проектировщик ЭО,ЭМ, ЭОС
 
Нижний Новгород
Регистрация: 18.07.2007
Сообщений: 257

здраствуйте.
помогите разодраться...
есть прога на VBA экспортирует этрибуты блоков в файл Excel.
есть желание немного поправить... но интеллекта нехватает, подскажите кому не лень... плиз.

1) Программа выкидывает все атрибуты выделенных блоков в файл Excel,
но при повторном запуске "помнит" выделенные блоки в прошлый раз и добавляет их к выделенным в этот раз. (приходится каждый раз закрывать файл и снова открывать, чтоб прога "забыла" прошлое выделение..
2) Очень хочется вконце открыть другой файл Excel, и запустить макрос, дольнейшей обработки в нем (файле Excel).



*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
Код:
[Выделить все]
Option Explicit

Public Sub WriteAttributes()

Dim oSset As AcadSelectionSet
Dim oEnt As AcadEntity
Dim oBlkRef As AcadBlockReference
Dim oAtt As AcadAttributeReference
Dim varAtt As Variant
Dim i As Long
Dim ftype(1) As Integer
Dim fdata(1) As Variant
ftype(0) = 0: fdata(0) = "INSERT"
ftype(1) = 66: fdata(1) = 1
Dim dxftype As Variant
Dim dxfdata As Variant
dxftype = ftype
dxfdata = fdata
'---------------------
Dim xlApp As Object
Dim xlBook As Workbook
Dim xlSheet As Worksheet
Dim lngRow As Long, lngCol As Long

'---------------------
On Error Resume Next
Set xlApp = GetObject(, "Excel.Application")
If Err <> 0 Then
Err.Clear
Set xlApp = CreateObject("Excel.Application")
If Err <> 0 Then
MsgBox "Impossible to initialize an Excel.", vbExclamation
End
End If
End If
'---------------------

On Error Resume Next
Set oSset = ThisDrawing.SelectionSets.Item("$Attribs$")
If Err Then
Err.Clear
Set oSset = ThisDrawing.SelectionSets.Add("$Attribs$")
End If

On Error GoTo Err_Control

oSset.SelectOnScreen dxftype, dxfdata
'---------------------
xlApp.Visible = True
Set xlBook = xlApp.Workbooks.Add
xlBook.Sheets.Add.Name = 1
Set xlSheet = xlBook.Sheets(1)
lngRow = 1
xlSheet.Cells(lngRow, 1).Value = "Block Name"
'For i = 2 To 11
'xlSheet.Cells(lngRow, i).Value = "Attribue " & CStr(i - 1)
'Next
'xlSheet.Rows(1).Font.Bold = True
'xlSheet.Rows(1).Font.ColorIndex = 5
'---------------------
lngRow = 2
Dim name_at As String
Dim ix As Integer

For Each oEnt In oSset

Set oBlkRef = oEnt
If oBlkRef.IsDynamicBlock Then
xlSheet.Cells(lngRow, 1).Value = oBlkRef.EffectiveName
Else
xlSheet.Cells(lngRow, 2).Value = oBlkRef.Name
End If
varAtt = oBlkRef.GetAttributes
lngCol = 2
lngCol = 7
For i = 0 To UBound(varAtt)
Set oAtt = varAtt(i)

'lngCol = 7
name_at = oAtt.TagString
If name_at = "NUM" Then
    lngCol = 3
End If
If name_at = "NOMINAL" Then
    lngCol = 4
End If
If name_at = "USTAVKA" Then
    lngCol = 5
End If
If name_at = "FAZA" Then
    lngCol = 6
End If
'xlSheet.Cells(lngRow, lngCol).Value = oAtt.TagString

If oAtt.TextString <> "" Then
    xlSheet.Cells(lngRow, lngCol).Value = oAtt.TextString
    lngCol = lngCol + 1
End If
Next i

lngRow = lngRow + 1

Next oEnt

'--------------------
Dim oRange As Range
Set oRange = xlSheet.UsedRange
For i = 1 To oRange.Columns.Count
xlSheet.Cells(1, i).Value = "Attribue " & CStr(i - 1)
Next
'--------------------
xlSheet.Columns.HorizontalAlignment = xlHAlignLeft
xlSheet.Columns.AutoFit
xlBook.SaveAs ThisDrawing.Path & "\Attributes.xls"
'xlBook.Close
'--------------------
'xlApp.Application.Quit
Set xlApp = Nothing
Set xlBook = Nothing
Set xlSheet = Nothing
'--------------------
'MsgBox "Done"
'--------------------

'[А здесь выполняешь свой макрос]

Err_Control:

End Sub
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

где нашел не помню, но где то здесь.
Просмотров: 9158
 
Непрочитано 09.01.2008, 15:58
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


Наверное, получится нечто типа такого:
Код:
[Выделить все]
Option Explicit

Private Function GetOrCreateObject(ObjectString As String) As Object
Dim obj As Object
  On Error Resume Next
  Set obj = GetObject(, ObjectString)
  If Err <> 0 Then
    Err.Clear
    Set obj = CreateObject(ObjectString) ' Исправил.
    If Err <> 0 Then
      Set obj = Nothing
    End If
  End If
  Set GetOrCreateObject = obj
End Function

Private Function GetBlockName(ByRef oAcadBlock As AcadBlockReference) As String
  On Error GoTo lErrIsDyn
  GetBlockName = oAcadBlock.EffectiveName
  Exit Function
lErrIsDyn:
  GetBlockName = oAcadBlock.Name
  Exit Function
End Function

Public Sub WriteAttributes()
Dim fData(1) As Variant, fType(1) As Integer
  fType(0) = 0: fData(0) = "INSERT": fType(1) = 66: fData(1) = 1
Dim oSelSet As AcadSelectionSet, SelSetName As String
  SelSetName = "$Attribs$"
  For Each oSelSet In ThisDrawing.SelectionSets
    If oSelSet.Name = SelSetName Then
      oSelSet.Delete
      Exit For
    End If
  Next oSelSet
  Set oSelSet = ThisDrawing.SelectionSets.Add(SelSetName)
  oSelSet.SelectOnScreen fType, fData
Dim xlApp As Object, xlBook As Object, xlWorksheet As Object, xlSheet As Object
  xlApp = GetOrCreateObject("Excel.Application")
  If Not (xlApp Is Nothing) Then
    xlApp.Visible = True
    Set xlBook = xlApp.workbooks.Add
    xlBook.Sheets.Add.Name = 1
    Set xlSheet = xlBook.Sheets(1)
    lngRow = 1
    xlSheet.Cells(lngRow, 1).Value = "Block Name"
Dim oAcadBlock As AcadBlockReference, arAttr As Variant
Dim lCol As Long, lRow As Long, lCounter As Long
    lRow = 2
    For Each oAcadBlock In oSelSet
      arAttr = oAcadBlock.GetAttributes
      lCol = 7
      For lCounter = LBound(arAttr) To UBound(arAttr)
        Select Case UCase(arAttr(lCounter).TagString)
          Case "NUM"
            lCol = 3
          Case "NOMINAL"
            lCol = 4
          Case "USTAVKA"
            lCol = 5
          Case "FAZA"
            lCol = 6
          Case Else
            lCol = lCol + 7
        End Select
        If Trim(arAttr(lCounter).TextString) <> "" Then
          xlSheet.Cells(lRow, lCol).Value = arAttr(lCounter).TextString
          lCol = lCol + 1
        End If
      Next lCounter
      lRow = lRow + 1
    Next oAcadBlock
  End If
'--------------------
Dim oRange As Range
Set oRange = xlSheet.UsedRange
For i = 1 To oRange.Columns.Count
xlSheet.Cells(1, i).Value = "Attribue " & CStr(i - 1)
Next
'--------------------
xlSheet.Columns.HorizontalAlignment = xlHAlignLeft
xlSheet.Columns.AutoFit
xlBook.SaveAs ThisDrawing.Path & "\Attributes.xls"
'xlBook.Close
'--------------------
'xlApp.Application.Quit
Set xlApp = Nothing
Set xlBook = Nothing
Set xlSheet = Nothing
'--------------------
'MsgBox "Done"
'--------------------

'[А здесь выполняешь свой макрос]

Err_Control:

End Sub
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 09.01.2008 в 16:30.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.01.2008, 16:27
#3
gizmo_zx

Проектировщик ЭО,ЭМ, ЭОС
 
Регистрация: 18.07.2007
Нижний Новгород
Сообщений: 257
<phrase 1= Отправить сообщение для gizmo_zx с помощью Skype™


не работает
!!! Argument not optional!!!

строка 8
Set obj = CreateObject(, ObjectString)

и еще по поводу 2)
открыть файл "c:\primer.xls"
в нем запустить макрос "модуль1"
gizmo_zx вне форума  
 
Непрочитано 09.01.2008, 16:30
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


Код исправил. Как открыть файл - ну это обычно не проблема. А вот как запустить в нем макрос - тайна лично для меня.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 09.01.2008, 16:34
#5
gizmo_zx

Проектировщик ЭО,ЭМ, ЭОС
 
Регистрация: 18.07.2007
Нижний Новгород
Сообщений: 257
<phrase 1= Отправить сообщение для gizmo_zx с помощью Skype™


с очисткой списка разобрался одной строкой спасибо за идею

oSset.Clear
gizmo_zx вне форума  
 
Непрочитано 09.01.2008, 16:56
#6
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


Clear'ом SelectionSet только очищается, но не уничтожается. ИМХО лучше как раз уничтожать его, не трогая объекты (.Delete вроде бы).
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 13.01.2008, 20:50
#7
Клякса

Инженер
 
Регистрация: 15.08.2007
Питер
Сообщений: 36
<phrase 1=


1) попробуй
Set obj =Nothing
это обнуляет переменную, также, как переменные с апплкейшеном, книгой и листом.

2) Запуск макроса программно
objWbNewBook.Application.Run ("Macross.xls!Пример") ' Запуск макроса

Здесь:

objWbNewBook As Object ' Переменная для объекта Книга
Macross.xls - имя файла, в котором "живет" твой макрос
Пример - имя макроса или сабы или функции или модуля. Можно как русскими, так и латинскими буквами называть.

У тебя эта строчка будет выглядеть как-то так:
xlBook.Application.Run("primer.xls!модуль1" )
__________________
Ошибку нашел и исправил, но в чем она заключалась, так и не понял...
Клякса вне форума  
 
Непрочитано 13.01.2008, 20:54
#8
Клякса

Инженер
 
Регистрация: 15.08.2007
Питер
Сообщений: 36
<phrase 1=


Вся прелесть ВБА под экселем в том, что можно записать макрос по запуску другого макроса :-)
__________________
Ошибку нашел и исправил, но в чем она заключалась, так и не понял...
Клякса вне форума  
 
Непрочитано 13.01.2008, 21:09
#9
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,404


Клякса, спасибо за инфу.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 14.01.2008, 23:23
#10
Клякса

Инженер
 
Регистрация: 15.08.2007
Питер
Сообщений: 36
<phrase 1=


Кажется, я погорячился. Имя модуля все-таки в ту строчку писать нельзя, только имя макроса, который содержится в каком-либо модуле (в одном модуле м.б. несколько макросов).
__________________
Ошибку нашел и исправил, но в чем она заключалась, так и не понял...
Клякса вне форума  
 
Автор темы   Непрочитано 15.01.2008, 09:23
#11
gizmo_zx

Проектировщик ЭО,ЭМ, ЭОС
 
Регистрация: 18.07.2007
Нижний Новгород
Сообщений: 257
<phrase 1= Отправить сообщение для gizmo_zx с помощью Skype™


всем спасибо!
если прога кому нужна обращайтесь,
по однолинейной схеме делает спецификацию в excel? а если Autocad 2008 можно и назад вставить готовую табличку
gizmo_zx вне форума  
 
Непрочитано 18.01.2008, 00:13
#12
VanDerKeen


 
Регистрация: 11.01.2008
Сообщений: 8


да, дай сцилку на прогу
__________________
проектные работы
http://www.chepr.ru
VanDerKeen вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > VBA + Autocad+Excel



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Таблицы из Excel в AutoCAD вставляются неполностью Nikolay_N AutoCAD 23 07.09.2019 21:12
связь текстовых полей AutoCad с ячейками в Excel April AutoCAD 9 29.06.2014 12:35
книги по VBA AutoCAD DY Программирование 30 15.02.2013 16:16
Перебор ячеек в Excel из VBA AutoCAD SVitaliy Программирование 6 10.10.2007 23:45
AutoCAD LT 2005 и VBA Macros Vidas Программирование 10 03.05.2005 11:00