Тема: Вопрос к kpblc

Нашла Ваш код на http://vbamaker.narod.ru/Cod2.html. Попробовала, но он почему то не работает.
В чем ошибка???

'Получение атрибутов (редактируемых) блока и вывод их в MsgBox
Sub GetBlockAttr()
Dim objBlock As AcadBlock, objBlockRef As AcadBlockReference
Dim objAttr As AcadAttribute
Dim SelSet As AcadSelectionSet
Dim SelBlock As AcadBlockReference
Dim sSelSetName As String, sBlockAttr As String
Dim filterType(0) As Integer
Dim filterData(0) As Variant
Dim blcAttr As Variant
Dim blcAttrCounter As Long, lCounter As Long
filterType(0) = 0
filterData(0) = "INSERT"
sSelSetName = "SelectionForGetBlockAttr"
For lCounter = 0 To ThisDrawing.SelectionSets.Count
If ThisDrawing.SelectionSets.Item(lCounter).Name = sSelSetName Then
ThisDrawing.SelectionSets.Item(lCounter).Clear
ThisDrawing.SelectionSets.Item(lCounter).Delete
Exit For
End If
Next 'lCounter
Set SelSet = ThisDrawing.SelectionSets.Add(sSelSetName)
SelSet.SelectOnScreen
sBlockAttr = ""
For lCounter = 1 To SelSet.Count
Set SelBlock = SelSet.Item(lCounter - 1)
blcAttr = SelBlock.GetAttributes
For blcAttrCounter = LBound(blcAttr) To UBound(blcAttr)
sBlockAttr = sBlockAttr + "; Tag: " +
blcAttr(blcAttrCounter).TagString + _
"; Value: " + blcAttr(blcAttrCounter).TextString
Next 'blcAttrCounter
sBlockAttr = sBlockAttr + vbCr
Next 'lCounter
'Удаление SelSet
SelSet.Clear
SelSet.Delete
MsgBox sBlockAttr
End Sub

Re: Вопрос к kpblc

Ох, если б я помнил, как я этот код рисовал... Сейчас-то я больше на лиспе работаю. Вот вариант (я не знаю, в каком месте была ошибка):

Option Explicit
Function fun_ClearSelectionSetByName(sName As String)
Dim lCounter As Long
  On Error Resume Next
  With ThisDrawing.SelectionSets
    For lCounter = 0 To .SelectionSets.Count
      If UCase(.Item(lCounter).Name) Like UCase(sName) Then
        .Item(lCounter).Clear
        .Item(lCounter).Delete
      End If
    Next
  End With
End Function
Sub GetBlockattr()
Dim objBlock As AcadBlock, objBlockRef As AcadBlockReference, objAttr As AcadAttribute
Dim SelSet As AcadSelectionSet
Dim fType(1) As Integer, fData(1) As Variant
Dim sAttr As String, arAttr() As AcadAttributeReference
  fType(0) = 0: fData(0) = "INSERT"
  fType(1) = 66: fData(1) = 1
  Dim sSelSetName As String
  sSelSetName = "SelectionForGetBlockAttr"
  fun_ClearSelectionSetByName (sSelSetName)
  On Error GoTo lErrorSelect
  Set SelSet = ThisDrawing.SelectionSets.Add(sSelSetName)
  SelSet.SelectOnScreen fType, fData
  Dim objSelSet As AcadEntity, lCounter As Long
  For Each objBlockRef In SelSet
    arAttr = objBlockRef.GetAttributes
    For lCounter = 0 To UBound(arAttr)
      If sAttr = "" Then
        sAttr = "Tag : " & arAttr(lCounter).TagString & " ; Value : " & arAttr(lCounter).TextString
      Else
        sAttr = sAttr & vbCr & "Tag : " & arAttr(lCounter).TagString & " ; Value : " & arAttr(lCounter).TextString
      End If
    Next 'lCounter
  Next 'objBlockRef
  MsgBox sAttr
  Exit Sub
lErrorSelect:
  MsgBox "Ничего не выбрано"
  fun_ClearSelectionSetByName (sSelSetName)
  Exit Sub
End Sub

Re: Вопрос к kpblc

P.S. Код практически не проверял.

Re: Вопрос к kpblc

> Кулик Алексей aka kpblc
Скажите пожалуйста а как сделать чтобы еще и имя блока, которому принадлежат найденные атрибуты высвечивалось?????
По схеме:
Название блока -> Атрибут №1 -> Атрибут №2

Re: Вопрос к kpblc

Что значит "высвечивалось"? В MsgBox'e, что ли? Ну тогда нечто типа получится:

Option Explicit
Dim EffectiveNameAvailable As Boolean
Private Sub fun_ClearSelectionSetByName(sName As String)
Dim lCounter As Long
  On Error Resume Next
  With ThisDrawing.SelectionSets
    For lCounter = 0 To .SelectionSets.Count
      If UCase(.Item(lCounter).Name) Like UCase(sName) Then
        .Item(lCounter).Clear
        .Item(lCounter).Delete
      End If
    Next
  End With
End Sub
Function fun_GetBlockName(objBlockRef As AcadBlockReference) As String
  If EffectiveNameAvailable Then
    fun_GetBlockName = objBlockRef.EffectiveName
  Else
    fun_GetBlockName = objBlockRef.Name
End Function
Sub GetBlockattr()
  EffectiveNameAvailable = CInt(Left(ThisDrawing.GetVariable("acadver"), _
    2)) >= 16
Dim objBlock As AcadBlock, objBlockRef As AcadBlockReference, _
  objAttr As AcadAttribute
Dim SelSet As AcadSelectionSet
Dim fType(1) As Integer, fData(1) As Variant
Dim sAttr As String, sTmpAttr As String, arAttr() As AcadAttributeReference
  fType(0) = 0: fData(0) = "INSERT"
  fType(1) = 66: fData(1) = 1
  Dim sSelSetName As String
  sSelSetName = "SelectionForGetBlockAttr"
  fun_ClearSelectionSetByName sSelSetName
  On Error GoTo lErrorSelect
  Set SelSet = ThisDrawing.SelectionSets.Add(sSelSetName)
  SelSet.SelectOnScreen fType, fData
  Dim objSelSet As AcadEntity, lCounter As Long
  For Each objBlockRef In SelSet
    If sAttr = "" Then
      sAttr = "Name : " & fun_GetBlockName(objBlockRef)
    Else
      sAttr = sAttr & vbCr & "Name : " & fun_GetBlockName(objBlockRef)
    End If
    arAttr = objBlockRef.GetAttributes
    For lCounter = 0 To UBound(arAttr)
      sAttr = sAttr & vbCr & "Tag : " & arAttr(lCounter).TagString & _
        " ; Value : " & arAttr(lCounter).TextString
    Next 'lCounter
  Next 'objBlockRef
  MsgBox sAttr
  Exit Sub
lErrorSelect:
  MsgBox "Ничего не выбрано"
  fun_ClearSelectionSetByName sSelSetName
  Exit Sub
End Sub

Re: Вопрос к kpblc

> Кулик Алексей aka kpblc
Спасибо большое.
Вы не могли бы, если это конечно не затруднит Вас, помочь мне предусмотреть в этом коде еще кое-что??? Это очень облегчит мне жизнь.
У меня в чертеже очень много блоков с разными атрибутами.
Очень хотелось бы, чтобы искал блоки с атрибутами в пространсте листа, не требуя выделить их на экране и  после того как код найдет количество блоков и атрибутов, он присваивал найденное количество переменным:
К примеру найденны блоки "П11-(211)"
n1 = количество именно этих блоков
d1 = все значения (не количество)атрибута №1
k1 = все значения (не количество)атрибута №2
Заранее благодарна Вам!!!

Re: Вопрос к kpblc

Мне очень важно присвоить значение блоков
П11-(211) именно в переменную n1, а атрибутам присвоить именно d1 и k1.
У меня есть код, в котором заложенны эти переменные и он их обрабатывает.
К примеру другой блок под названием "А11-(211)" в том коде запрограммирован в переменной n2, а значения его атрибутов в d2 и k2.
Пожалуйста не откажите в помощи. Очень Вас прошу...